有没有办法使这更有效(Matlab)?

时间:2014-04-01 17:17:35

标签: matlab

我已经找到了一种适用于我的目的的方法,但是我希望能够将解决方案推广到更多数量的试验,而不必为每次试验增加硬编码新的if语句。现在试验= 4,如果我想试验= 5,我需要写一个新的if语句。

if new_A == 1:trials;
   outer_matrices{:,1} = A;
end
if new_A == trials+1:trials*2;
   outer_matrices{:,2} = A;
end
if new_A == (trials*2)+1:trials*3;
   outer_matrices{:,3} = A;
end
if new_A == (trials*3)+1:trials*4;
   outer_matrices{:,4} = A;
end

你看到模式(试验= 5我需要分别乘以4和5,然后改为外部矩阵{:,5})

我确信这是一个我想不到的相当简单的解决方案/结构。提前谢谢!

3 个答案:

答案 0 :(得分:0)

试试这个(没有循环或条件方法) -

N = 5;%%// Number of cases
ind = find(all(bsxfun(@eq,reshape(1:trials*N,trials,[]),new_A'),1))
outer_matrices{:,ind} = A;

答案 1 :(得分:0)

我认为new_A是一个元素数量为trials的向量。由于(trials*n)+1:trials*(n+1)[trials*n+1, trials*n+2, ... ]形式的向量,您可以这样做:

if ~mod(new_A(1)-1,trials) && all(diff(new_A) == 1)
   outerMatrices{(trials+new_A(1)-1)/trials} = A;
end 

它的作用是:

~mod(new_A(1)-1,trials)使用modulus操作来检查new_A中的第一个元素是否可以被试验整除。如果是,则mod将返回0~前面的mod表示“不是”,因此如果mod返回零,则评估为“~0 == 1”。

all(diff(new_A)==1)检查new_A中的所有元素是否恰好是一个元素。

答案 2 :(得分:0)

用于镜像问题代码的基本for循环方法是:

N=5;
for ii=1:N
    if new_A == trials*(ii-1)+1:trials*ii
        outer_matrices{:,ii} = A;
    end
end