Строка:
new_img(rows,cols,:) = curMean;
будет работать только в том случае, если rows
и cols
являются скалярными значениями.Если они являются векторами, есть несколько вариантов, которые вы должны правильно выполнить, в зависимости от того, какое именно назначение вы делаете.Как Jonas упоминает в своем ответе , вы можете либо назначить значения для каждой парной комбинации индексов в rows
и cols
, либо вы можете назначить значения для каждой пары [rows(i),cols(i)]
.Для случая, когда вы присваиваете значения для каждой парной комбинации, вот несколько способов сделать это:
Разбейте присвоение на 3 шага, по одному для каждой плоскости втретье измерение:
new_img(rows,cols,1) = curMean(1); %# Assignment for the first plane
new_img(rows,cols,2) = curMean(2); %# Assignment for the second plane
new_img(rows,cols,3) = curMean(3); %# Assignment for the third plane
Вы также можете сделать это в цикле for, как Джонас предложил , но для такого небольшого числа итераций мне нравится использовать "развернутую" версиюкак указано выше.
Используйте функции RESHAPE и REPMAT для curMean
, чтобы изменить форму и скопировать вектор так, чтобы он соответствовал размерамподиндексированный раздел new_img
:
nRows = numel(rows); %# The number of indices in rows
nCols = numel(cols); %# The number of indices in cols
new_img(rows,cols,:) = repmat(reshape(curMean,[1 1 3]),[nRows nCols]);
Для примера того, как работает выше, допустим, у меня есть следующее:
new_img = zeros(3,3,3);
rows = [1 2];
cols = [1 2];
curMean = [1 2 3];
Любое из приведенных выше решений даст вам такой результат:
>> new_img
new_img(:,:,1) =
1 1 0
1 1 0
0 0 0
new_img(:,:,2) =
2 2 0
2 2 0
0 0 0
new_img(:,:,3) =
3 3 0
3 3 0
0 0 0