索引出矩阵的列向量,然后乘以相应的矩阵

时间:2016-03-22 06:03:55

标签: matlab

我的计算量如下:

L = ones(100000,200000);
for i = 1:10000
    temp = f(i,...);
    L = L .* temp(:, index );
end

其中temp 100,000 * 3矩阵(从f(i,...)计算的值;我在此省略参数),index 1 * 200,000整数向量(1到3)。

我必须在我的算法中进行多次。我觉得Matlab浪费时间在迭代中从temp(:, index )创建100000 * 200000。但是,它可能没有必要;也就是说,我们可以只提取相应的列,然后乘以L的相应列。然而,我找不到有效地做到这一点的方法......

希望任何人都能就此提出建议。谢谢!

我给出了一个小而假设的例子:

function test
x = rand(5,3);
t = rand(10,1); % could be very long
point = 3;
index = [1 2 1 3 2 3 1 2;...
         2 3 2 1 2 3 1 1;...
         1 1 1 2 2 3 1 1;...
         3 3 2 3 2 2 2 1;...
         2 3 2 1 2 1 3 1]; % could be very long
L = ones(10,8);
for i = 1:5
    temp = myfun(x(i,:),t,point);
    L = L .* temp(:, index(i,:) );
end
    function prob = myfun(x,t,point)
    prob = ones(size(t,1),point);
    for k = 2:point 
        prob(:,k) = exp( ((k-1).*x(1).*(t) + x(k) ));
    end
    de = sum(prob,2);
    for k = 1:point
        prob(:,k) = prob(:,k)./de;
    end
    end
end

1 个答案:

答案 0 :(得分:1)

我设法在每次迭代期间只保存一些小的计算,但也许它会对你的大型矩阵产生影响。我所做的是将一行改为prob(:,k) = exp( ((k-1).*x(i,1).*(t) + x(i,k) ));。注意x中的元素。这节省了一些不必要的计算优化它有点困难,因为我不知道这是什么,但这是我的代码:

x = rand(5,3);
t = rand(10,1);
point = 3;
index = [1 2 1 3 2 3 1 2;...
         2 3 2 1 2 3 1 1;...
         1 1 1 2 2 3 1 1;...
         3 3 2 3 2 2 2 1;...
         2 3 2 1 2 1 3 1];
L = ones(10,8);
for i = 1:5
    prob = ones(size(t,1),point);
    for k = 2:point 
        prob(:,k) = exp( ((k-1).*x(i,1).*(t) + x(i,k) ));
    end
    de = sum(prob,2);
    for k = 1:point
        prob(:,k) = prob(:,k)./de;
    end
    L = L .* prob(:, index(i,:) );
end

我注意到有一些危险的操作,例如de = sum(prob,2);。请注意,如果您将prob(:,k) = prob(:,k)./de;更改为prob(:,k) = prob(:,k)./sum(prob,2);,则会得到不同的结果。也许你已经意识到了这一点,但值得一提。如果还有什么我可以提供的帮助,请告诉我。