Arrays Matlab中四个嵌套循环的消除

Arrays Matlab中四个嵌套循环的消除,arrays,performance,matlab,multidimensional-array,vectorization,Arrays,Performance,Matlab,Multidimensional Array,Vectorization,我在Matlab中有以下四个嵌套循环: timesteps = 5; inputsize = 10; additionalinputsize = 3; outputsize = 7; input = randn(timesteps, inputsize); additionalinput = randn(timesteps, additionalinputsize); factor = randn(inputsize, additionalinputsize, outputsize); ou

我在Matlab中有以下四个嵌套循环:

timesteps = 5;
inputsize = 10;
additionalinputsize = 3;
outputsize = 7;

input = randn(timesteps, inputsize);
additionalinput = randn(timesteps, additionalinputsize);
factor = randn(inputsize, additionalinputsize, outputsize);

output = zeros(timesteps,outputsize);
for t=1:timesteps
    for i=1:inputsize
        for o=1:outputsize
            for a=1:additionalinputsize
                output(t,o) = output(t,o) + factor(i,a,o) * input(t,i) * additionalinput(t,a);
            end
        end
    end
end
有三个向量:一个输入向量、一个附加输入向量和一个输出向量。所有这些因素都有联系。每个向量在给定的时间步长上都有值。我需要所有组合输入、附加输入和每个给定时间步的因子的总和。稍后,我需要计算从输出到输入:

result2 = zeros(timesteps,inputsize);
for t=1:timesteps
    for i=1:inputsize
        for o=1:outputsize
            for a=1:additionalinputsize
                result2(t,i) = result2(t,i) + factor(i,a,o) * output(t,o) * additionalinput(t,a);
            end
        end
    end
end
在第三种情况下,我需要在每个时间步上求和所有三个向量的乘积:

product = zeros(inputsize,additionalinputsize,outputsize)
for t=1:timesteps
    for i=1:inputsize
        for o=1:outputsize
            for a=1:additionalinputsize
                product(i,a,o) = product(i,a,o) + input(t,i) * output(t,o) * additionalinput(t,a);
            end
        end
    end
end
这两个代码段可以工作,但速度非常慢。如何删除嵌套循环

编辑:添加值并更改次要内容,使代码段可执行


Edit2:添加了其他用例

第一部分

t11 = bsxfun(@times,additionalinput,permute(output,[1 3 2]));
t22 = bsxfun(@times,permute(t11,[1 4 2 3]),permute(factor,[4 1 2 3]));
result2=sum(sum(t22,3),4);
t11 = bsxfun(@times,permute(output,[4 3 2 1]),permute(additionalinput,[4 2 3 1]));
t22 = bsxfun(@times,permute(input,[2 4 3 1]),t11);
product = sum(t22,4);
一种方法-

t1 = bsxfun(@times,additionalinput,permute(input,[1 3 2]));
t2 = bsxfun(@times,t1,permute(factor,[4 2 1 3]));
t3 = permute(t2,[2 3 1 4]);
output = squeeze(sum(sum(t3)));
或一种轻微的变体,以避免挤压-

t1 = bsxfun(@times,additionalinput,permute(input,[1 3 2]));
t2 = bsxfun(@times,t1,permute(factor,[4 2 1 3]));
t3 = permute(t2,[1 4 2 3]);
output = sum(sum(t3,3),4); 

第二部分

t11 = bsxfun(@times,additionalinput,permute(output,[1 3 2]));
t22 = bsxfun(@times,permute(t11,[1 4 2 3]),permute(factor,[4 1 2 3]));
result2=sum(sum(t22,3),4);
t11 = bsxfun(@times,permute(output,[4 3 2 1]),permute(additionalinput,[4 2 3 1]));
t22 = bsxfun(@times,permute(input,[2 4 3 1]),t11);
product = sum(t22,4);

第三部分

t11 = bsxfun(@times,additionalinput,permute(output,[1 3 2]));
t22 = bsxfun(@times,permute(t11,[1 4 2 3]),permute(factor,[4 1 2 3]));
result2=sum(sum(t22,3),4);
t11 = bsxfun(@times,permute(output,[4 3 2 1]),permute(additionalinput,[4 2 3 1]));
t22 = bsxfun(@times,permute(input,[2 4 3 1]),t11);
product = sum(t22,4);

这个问题不是关于统计的,可能不适合这个论坛。请提供一个简单的例子。定义所有变量,这样我们就可以运行代码。您是否打算从循环内部保存值,因为您当前的工作方式不太好!你能帮我解决刚才添加的第三个用例吗?@user1406177也添加了解决方案。回答得很好。总是很高兴看到bsxfun在运行。@FredS让
bsxfun
去探索是一个很大的问题!顺便说一句:)@user1406177
t11=bsxfun(@times,additionalinput,permute(factor,[4 2 1 3]);t22=bsxfun(@times,t11,permute(输出,[1 3 4 2]));结果2=挤压(总和(总和(t22,2,4))