Подтвердить что ты не робот

Как вставить столбец/строку из них в матрицу?

Предположим, что мы имеем матрицу 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

Каков наилучший способ получить его?

4b9b3361

Ответ 1

Легкий встроенный способ сделать это:

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

Ответ 2

В 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

Ответ 3

Один из способов сделать это:

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

prependOnes(b)

Ответ 4

Я хотел бы отметить, что [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

Итак, если вам нужно постоянно расти свою матрицу, сначала создайте целевую матрицу, а затем присвойте ей значение. Или реализуйте что-то вроде матрицы изменения размера, если вы заранее не знаете конечный размер.

Ответ 5

Функция 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 столбцом. Функция допускает большую гибкость при заполнении матриц, но может быть излишним для действительно простых вещей.