Предположим, что мы имеем матрицу 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
Каков наилучший способ получить его?
Предположим, что мы имеем матрицу 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
Каков наилучший способ получить его?
Легкий встроенный способ сделать это:
b = [ones(size(b, 1), 1) b];
В 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
Один из способов сделать это:
function [result] = prependOnes(matrix)
result = [ones(rows(matrix),1) matrix];
end
prependOnes(b)
Я хотел бы отметить, что [A B]
фактически создает новую матрицу как противоположенную вставке, что должно быть очевидно из ее синтаксической конструкции. Но я вижу, что много места используют слово append или 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
Итак, если вам нужно постоянно расти свою матрицу, сначала создайте целевую матрицу, а затем присвойте ей значение. Или реализуйте что-то вроде матрицы изменения размера, если вы заранее не знаете конечный размер.
Функция padarray (из пакет изображений) был разработан таким образом, чтобы делать именно это.
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
Функции читают pre pad переменной b
с 0 строками и 1 столбцом. Функция допускает большую гибкость при заполнении матриц, но может быть излишним для действительно простых вещей.