2014-11-09 3 views
-1

Я выполняю следующий код, чтобы получить умножение матрицы между изображением и w. Зачем нужна ошибка Subscripted assignment dimension mismatch.Несоответствие размеров подзапросов в matlab

[e,f] = size(outImg);  
m = zeros(e,f);  
w = [1 2 4 8; 16 32 64 128; 256 512 1024 2048; 4096 8192 16384 32768];  
for i = 1:e-3  
    for j = 1:f-3  
     I = double(outImg((i:i+3),(j:j+3)));  
     m(i,j) = I * w;  
    end  
end 
+1

Это потому, что 'I' является матрицей 4 x 4 и' w' также является матрицей 4 x 4. Вы пытаетесь сжать умножение двух матриц 4 x 4 ... которое также является матрицей 4 x 4 в одно место в 'm'. Недостаточно мест на левой стороне вашего выражения для правой стороны. Что именно вы пытаетесь достичь здесь? «Матричное умножение между изображением и« w' * »не имеет для меня никакого смысла. – rayryeng

+3

Полезный совет: нажмите ctrl + a, чтобы выбрать весь код в окне редактора, а затем нажмите ctrl + i, чтобы автоматически отменить свой код. Это облегчит чтение. – David

+0

Здесь я должен вычислить значение индекса, где у меня есть изображение, и я сделал 4x4 перекрывающиеся блоки изображения, а затем я сделал массив из 2ᵏ значений (где 2ᵏ = 0..2^16), и мне нужно закодировать index as = Σ 〖2ᵏSͪ〗, где S^h = Изображение 4x4 блок – STripathy

ответ

0

Это продолжение из моего комментария и теперь понимание того, что вы действительно после. То, что вы намеревались сделать, это выполнить умножение по элементам I и w, затем sum все элементы в матрице. То, что я подразумеваю под каждым элементом, состоит в том, что соответствующие значения в одной матрице умножаются на соответствующие позиции в другой матрице, и это конечный результат. Таким образом, вам просто нужно изменить оператора * на .*, а затем выполнить суммирование по всей этой матрице. Другими словами, это сделать:

[e,f] = size(outImg);  
m = zeros(e,f);  
w = [1 2 4 8; 16 32 64 128; 256 512 1024 2048; 4096 8192 16384 32768];  
for i = 1:e-3  
    for j = 1:f-3  
     I = double(outImg((i:i+3),(j:j+3)));  
     m(i,j) = sum(sum(I .* w)); %// Change 
    end  
end 

Обратите внимание на вложенные sum вызовы. Это связано с тем, что при суммировании по матрице по умолчанию она суммирует по всем строкам для каждого столбца и создает вектор с одной строкой, содержащий этот результат. Если вы хотите суммировать каждое значение в матрице, вы должны вызывать sum еще раз, чтобы суммировать по вектору строки, чтобы вычислить общую сумму матрицы. Теперь это должно равняться одному значению, и вы больше не должны получать ошибку несоответствия размеров.

Удачи вам!

+0

Спасибо, что так оно сработало. – STripathy

+0

Я хочу сохранить значения m (i, j) в 1D массиве из 2 строк. 1-я строка wd - счетчик m (ij), а вторая строка w будет значением m (ij) для каждой итерации. Как я могу это сделать? Пожалуйста, помогите – STripathy

+0

Я задал еще один вопрос. хотите преобразовать 2D в 1D массив, например массив (2, count). – STripathy

Смежные вопросы