МАТЛАБ: Как исправить несоответствие размеров подписанного назначения? - PullRequest
1 голос
/ 25 января 2011

new_img is ==>

new_img = zeros(height, width, 3); 

curMean выглядит так: [double, double, double]

new_img(rows,cols,:) = curMean;

так что здесь не так?

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Строка:

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
2 голосов
/ 25 января 2011

Будьте осторожны с такими заданиями!

a=zeros(3);
a([1 3],[1 3]) = 1
a =
     1     0     1
     0     0     0
     1     0     1

Другими словами, вы назначаете все комбинации индексов строк и столбцов. Если это то, что вы хотите, пишите

for z = 1:3
   newImg(rows,cols,z) = curMean(z);
end

должен получить то, что вы хотите (как предложено @ gnovice ).

Однако, если rows и cols являются совпадающими парами (т. Е. Вы хотите назначить 1 только элементам (1,1) и (3,3) в приведенном выше примере), вам лучше написать

for i=1:length(rows)
    newImg(rows(i),cols(i),:) = curMean;
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...