假设我们有一个像
这样的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
获得它的最佳方法是什么?
答案 0 :(得分:89)
一种简单的内联方式是:
b = [ones(size(b, 1), 1) b];
答案 1 :(得分:16)
在GNU Octave中:
将两个矩阵水平连接在一起:用矩阵分隔矩阵,
并将结果括在方括号中:
X = [ones(rows(X), 1) X];
更简单的例子:
在一个数字上粘贴(添加水平"列"带逗号的元素):
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
答案 2 :(得分:7)
一种方法是:
function [result] = prependOnes(matrix)
result = [ones(rows(matrix),1) matrix];
end
prependOnes(b)
答案 3 :(得分:3)
我想指出[A B]
实际上创建了新矩阵,与插入相反,这应该从其句法结构中显而易见。但是我看到很多地方使用追加或插入这个词,我想知道八度音是否做了任何聪明的事情,所以我进行了测试
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
因此,如果您需要不断增长矩阵,请先创建目标矩阵,然后为其指定值。如果你事先不知道最终的维度,或者实现像resizing-matrix这样的东西。
答案 4 :(得分:2)
函数padarray(来自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列。该函数在填充矩阵时允许很大的灵活性,但对于非常简单的东西可能有点过分。
答案 5 :(得分:0)
b矩阵定义如下
int, string
通过添加新的1s列来创建新矩阵,如下所示:
>> b = [1 2 3;4 5 6;7 8 9]
b =
1 2 3
4 5 6
7 8 9
通过添加如下所示的新的1s行来创建新矩阵
>> [ones(size(b), 1) b]
ans =
1 1 2 3
1 4 5 6
1 7 8 9
答案 6 :(得分:0)
您有一个3x3的矩阵,例如
b = 2 * eye(3)
ans =
2 0 0
0 2 0
0 0 2
您可以在下面添加一列,并接收新的4x3矩阵
[ones(size(b, 1), 1) b]
ans =
1 2 0 0
1 0 2 0
1 0 0 2
您可以如下添加一行,并接收新的3x4矩阵
[ones(1,size(b, 2)); b]
ans =
1 1 1
2 0 0
0 2 0
0 0 2