Матрицы Matlab разных размеров (индексация, для цикла и bsxfun)

У меня есть две матрицы разных размеров. Давайте просто определим матрицу {a} как a(1:10) <10 x 1> и матрицу {b} как b(6:10) <5 x 1>. Мне нужен цикл for или его эквивалент (bsxfun), который получает разницу между матрицей {a} и {b}, код будет повторяться в зависимости от размера матрицы {b}. Например, первое значение матрицы {a} равно 1, код получит разницу всех значений матрицы {b}. Таким образом, он будет работать в общей сложности 5 раз. Следующее значение матрицы {a} равно 2, код будет повторяться 5 раз. Код будет повторяться до конца матрицы {a}, которая равна 10.

Если бы вы могли, вы могли бы написать как цикл for без bsxfun, так и цикл с и объяснить, как вы проиндексировали значения. Кроме того, только для моего назидания, вместо двух матриц, как изменился бы код, если бы было N матриц (N>2)?

Спасибо.

2 ответа

Решение

Вот решение цикла и repmat решение.

% Определите некоторые примеры данных.

Редактировать: a а также b являются векторами столбцов, а не векторными строками.

a = [ 1:10 ]';

b = [ 6:10 ]'; % 5:10 имеет размер по вертикали 6, а не 5, поэтому для соответствия вопроса 6:10 используется.

Во-первых, самое простое решение для цикла: пройти через все aIndex,bIndex пары, вычтите разницу элементов, aIndex а также bIndex и сохранить результат в LoopDifferenceMatrix(aIndex, bIndex),

for aIndex = 1:size(a,1)
    for bIndex = 1:size(b,1)
        LoopDifferenceMatrix(aIndex, bIndex) = a(aIndex) - b(bIndex);
    end
end

Это альтернатива repmat решение. копировать a по горизонтали с помощью repmat так что его горизонтальный размер совпадает size(b,1) (горизонтальный размер b). Затем скопируйте транспонированный b по вертикали с помощью repmat так что его вертикальный размер совпадает size(a,1) (оригинальный горизонтальный размер a). Вычитать реплицируется a из реплицированного b и сохранить результат в DifferenceMatrix,

DifferenceMatrix = repmat(a, 1, size(b,1)) - repmat(b', size(a,1), 1);

DifferenceMatrix =
-5    -6    -7    -8    -9
-4    -5    -6    -7    -8
-3    -4    -5    -6    -7
-2    -3    -4    -5    -6
-1    -2    -3    -4    -5
 0    -1    -2    -3    -4
 1     0    -1    -2    -3
 2     1     0    -1    -2
 3     2     1     0    -1
 4     3     2     1     0 

isequal(DifferenceMatrix, LoopDifferenceMatrix)
ans =
1

Это то, что вы пытаетесь сделать?

a = 1:10;
b = 6:10;
c = zeros(length(b),length(a));
d = zeros(length(b),length(a));

for n = 1:length(b)
    c(n,:) = bsxfun(@minus,a,b(n));
    d(n,:) = a - b(n);
end

Что касается того, как сделать это с N матрицами, вам нужно будет указать, что вы хотите сделать с N-й матрицей.

Другие вопросы по тегам