Матрицы 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-й матрицей.