web-dev-qa-db-ja.com

行列に1の列/行を挿入する方法は?

次のような3x3行列があると仮定します

b = 2 * eye(3);
ans =

2   0   0
0   2   0
0   0   2

そして、私は次のような3x4の行列にしたい

1   2   0   0
1   0   2   0
1   0   0   2

それを得る最良の方法は何ですか?

51
ecerulm

これを行う簡単なインライン方法は次のとおりです。

b = [ones(size(b, 1), 1) b];

90
carl_h

In GNU Octave:

2つのマトリックスを水平方向に連結します:スペースでマトリックスを分離し、
そして結果を角括弧で囲みます:

X = [ones(rows(X), 1) X];

より簡単な例:
1つの番号に接着(水平の「列」要素にカンマを追加):

octave:1> [[3,4,5],8]
ans =
   3   4   5   8

コンマを使用して、別のマトリックスに水平に(追加の列として)接着します。

octave:2> [[3,4,5],[7,8,9]]
ans = 
   3   4   5   7   8   9

セミコロンを使用して別のマトリックスに垂直に(追加の行として)接着します。

octave:3> [[3,4,5];[7,8,9]]
ans =
   3   4   5
   7   8   9
18
sdn342323

1つの方法は次のとおりです。

function [result] = prependOnes(matrix)
  result = [ones(rows(matrix),1) matrix];
end

prependOnes(b)
7
ecerulm

[A B]は、実際には挿入とは反対に新しいマトリックスを作成します。これは、その構文構造から明らかです。しかし、Wordappendまたはinsertオクターブが背後で何か巧妙なことをしているのではないかと思うので、テストを実行します

function testAppend(repeat)

profile off;
profile on; 
testAdd(repeat);
testAssign(repeat);
profile off;
data = profile('info');
profshow(data, 5); 

end

function testAdd(repeat)
for i = 1:repeat
    A = ones(100, 1); 
    B = ones(100, 1); 
    for j = 1:10000
        A = [A B]; 
    end 
end
end

function testAssign(repeat)
for i = 1:repeat
    B = ones(100, 1); 
    A = zeros(100, 10000);
    for j = 2:10001
        A(:, j) = B;
    end 
end
end

そして、ここに結果があります

octave:1> testAppend(1)
   #              Function Attr     Time (s)        Calls
---------------------------------------------------------
   1    testAppend>testAdd             9.454            1
   3 testAppend>testAssign             0.023            1
   4                 zeros             0.001            1
   5               profile             0.000            1
   2                  ones             0.000            3

そのため、マトリックスを継続的に成長させる必要がある場合は、最初にターゲットマトリックスを作成してから、値を割り当てます。または、最終的な次元が事前にわからない場合は、サイズ変更マトリックスのようなものを実装します。

3
Sky

関数 padarray (from image package )は、まさにそれを行うために設計されました。

octave> b = 2 * eye (3)
b =

Diagonal Matrix

   2   0   0
   0   2   0
   0   0   2

octave> padarray (b, [0 1], 1, "pre")
ans =

   1   2   0   0
   1   0   2   0
   1   0   0   2

この関数は、変数bに0行と1列を事前に埋め込みます。この関数は、行列をパディングする際に大きな柔軟性を可能にしますが、本当に単純なものではやり過ぎかもしれません。

2
carandraug

B行列は以下のように定義されます

>> b = [1 2 3;4 5 6;7 8 9]
b =

   1   2   3
   4   5   6
   7   8   9

以下のように1の新しい列を追加して新しいマトリックスを作成します

>> [ones(size(b), 1) b]
ans =

   1   1   2   3
   1   4   5   6
   1   7   8   9

以下のように1の新しい行を追加して新しいマトリックスを作成します

>> [ones(size(b)(2), 1)';b]
ans =

   1   1   1
   1   2   3
   4   5   6
   7   8   9
0
rainu