Рекурсивно заполнить массив в MATLAB - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь заполнить массив I Использование рекурсивной формулы. Формула показана ниже. enter image description here

В этой формуле я уже вычислил массив B и знаю все элементы, а M - это размерность B массив, который равен размеру I массив. Буквы u, v и w обозначают индексы. Моя функция:

function I_matrix = fill_I_recursively(B_matrix, u_ind, v_ind, w_ind)
M = size(B_matrix,1);
if u_ind == 1 && v_ind == 1 && w_ind == 1
    I_matrix(u_ind,v_ind,w_ind) = 0; 
else
    if w_ind > 1
        I_matrix(u_ind,v_ind,w_ind) = fill_I_recursively(B_matrix, u_ind, v_ind, w_ind-1) + B_matrix(u_ind,v_ind,w_ind-1);
    elseif v_ind > 1
        I_matrix(u_ind,v_ind,w_ind) = fill_I_recursively(B_matrix, u_ind, v_ind-1, M-1) + B_matrix(u_ind,v_ind-1,M-1);
    else
        I_matrix(u_ind,v_ind,w_ind) = fill_I_recursively(B_matrix, u_ind-1,  M-1, M-1) + B_matrix(u_ind-1,M-1,M-1);
   end
end

Я вызываю эту функцию в моей программе:

I_matrix = NaN(max_boxes,max_boxes,max_boxes);
%%fill the I matrix using recursive function
for u_ind = 1:max_boxes
    for v_ind = 1:max_boxes
        for w_ind = 1:max_boxes
            I_matrix(u_ind,v_ind,w_ind) = fill_I_recursively(B_matrix, u_ind, v_ind, w_ind);
        end
    end
end

Когда он запускается, я получаю сообщение об ошибке «Назначение имеет больше не-одноэлементных rhs-измерений, чем не-одноэлементных подписок». Не могли бы вы помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 07 января 2019

Проблема возникает из-за разницы в ожиданиях для вашей функции fill_I_recursively.

В вашем определении функции выводом является I_matrix, который является многомерным массивом.

В вашей основной программе ожидаемое значение fill_I_recursively представляет собой скаляр, который заполняется в запись многомерного массива I_matrix.

Вам следует изменить один из двух разделов, чтобы они были согласованными.

Вот пример того, как изменить определение вашей функции для вывода скаляра:

function I_uvw = fill_I_recursively(B_matrix, u_ind, v_ind, w_ind)
M = size(B_matrix,1);
if u_ind == 1 && v_ind == 1 && w_ind == 1
    I_uvw = 0; 
else
    if w_ind > 1
        I_uvw = fill_I_recursively(B_matrix, u_ind, v_ind, w_ind-1) + B_matrix(u_ind,v_ind,w_ind-1);
    elseif v_ind > 1
        I_uvw = fill_I_recursively(B_matrix, u_ind, v_ind-1, M-1) + B_matrix(u_ind,v_ind-1,M-1);
    else
        I_uvw = fill_I_recursively(B_matrix, u_ind-1,  M-1, M-1) + B_matrix(u_ind-1,M-1,M-1);
   end
end
...