转换为了在Matlab中更快的语法

时间:2015-08-07 14:52:59

标签: matlab

我有下面的代码,我想将它转换为更快的方式,但我不知道如何转换在Matlab中以更快的方式转换语法。 如果用户数为5且项目数为2且时间计数为4,我想创建此矩阵:
    1 1 1
    1 1 2
    1 1 3
    1 1 4
    1 2 1
    1 2 2
    1 2 3
    1 2 4
    2 1 1
    2 1 2
    2 1 3
    2 1 4
...

result=zeros(userCount*itemCount*timeCount,4);
j=0;
for i=1:userCount
     result(j*itemCount*timeCount+1:j*itemCount*timeCount+itemCount*timeCount,1)=ones(itemCount*timeCount,1)*i;
     j=j+1;
end
j=0;
h=1;
for i=1:userCount*itemCount
    result(j*timeCount+1:j*timeCount+timeCount,2)=ones(timeCount,1)*(h);
    j=j+1;
    h=h+1;
    if h>itemCount
           h=1;
     end
 end
j=0;
for i=1:userCount*itemCount
     result(j*timeCount+1:j*timeCount+timeCount,3)=1:timeCount;
     j=j+1;
end
for i=1:size(subs,1)
     f=(result(:,1)==subs(i,1)& result(:,2)==subs(i,2));
     result(f,:)=[];
 end

1 个答案:

答案 0 :(得分:1)

您所描述的是枚举三个独立线性集的排列。实现此目的的一种方法是使用ndgrid并将每个输出展开到一个向量中:

userCount = 5; itemCount = 2; timeCount = 4;
[X,Y,Z] = ndgrid(1:timeCount,1:itemCount,1:userCount);
result = [Z(:) Y(:) X(:)];

我们得到:

result =

     1     1     1
     1     1     2
     1     1     3
     1     1     4
     1     2     1
     1     2     2
     1     2     3
     1     2     4
     2     1     1
     2     1     2
     2     1     3
     2     1     4
     2     2     1
     2     2     2
     2     2     3
     2     2     4
     3     1     1
     3     1     2
     3     1     3
     3     1     4
     3     2     1
     3     2     2
     3     2     3
     3     2     4
     4     1     1
     4     1     2
     4     1     3
     4     1     4
     4     2     1
     4     2     2
     4     2     3
     4     2     4
     5     1     1
     5     1     2
     5     1     3
     5     1     4
     5     2     1
     5     2     2
     5     2     3
     5     2     4