Умножение 4D матрицы на вектор и свертывание 1 измерения - PullRequest
0 голосов
/ 17 октября 2018

У меня есть вопрос относительно умножения 4-мерного объекта на 1-мерный объект.По сути, у меня есть четырехмерный объект размеров (15,15,3,5).Я хочу умножить 4-е измерение, используя вектор 5x1, свернув последнее измерение до 1. Затем я хочу использовать squeeze, чтобы получить объект размером (15,15,3), снова умножив его на вектор 3x1, оставив меняс матрицей 15x15.

Я могу сделать это в цикле, но это довольно дорого.Может кто-нибудь дать мне предложения, как это сделать без цикла?

А пока цикл:

expectationCalc = reshape(mValueFunction(age+1, :, :, :, :), nGridAssets, nGridHumanCapital, nNetInterestRate, nShockstoHumanCapital);
for i = 1:nGridAssets
    for j = 1:nGridHumanCapital
        expectation(i,j) = mTransitionNetInterestRate(nNetIntRate, :)*(squeeze(expectationCalc(i,j,:,:))*mTransitionShockHumanCapital(ShockHcapital, :)');
    end
end 

1 Ответ

0 голосов
/ 17 октября 2018

Если вы преобразуете свою 4D-матрицу в 2D-матрицу, где 2-е измерение - это то, которое вы хотите уменьшить на точечное произведение, а 1-е измерение содержит все другие измерения, тогда вы можете применить регулярное умножение матриц.Затем результат можно изменить до исходного размера (минус одно измерение):

% Input data
M = randn(15,15,3,5);
v1 = randn(5,1);
v2 = randn(3,1);

% 1st multiplication
sz = size(M);
M = reshape(M,[],sz(end));
M = M * v1;
sz(end) = [];       % We no longer have that last dimension
M = reshape(M,sz);

% 2nd multiplication
M = reshape(M,[],sz(end));
M = M * v2;
sz(end) = [];       % We no longer have that last dimension
M = reshape(M,sz);
...