2015-04-05 58 views
1

假设我有一个名为“cellPoints”的空m-by-p维度单元格,并且我还有一个名为“cellIdx”的D-3维数组,其中每行i包含“cellPoints”中的下标。现在我想计算“cellPoints”,以便cellPoints {x,y,z}包含“cellIdx”中的一行数字数组。使用matlab对矩阵中的行进行索引

甲幼稚实现可以是

for i = 1:size(cellIdx, 1) 
    cellPoints{cellIdx(i, 1), cellIdx(i, 2), cellIdx(i, 3)} = ... 
    [cellPoints{cellIdx(i, 1), cellIdx(i, 2), cellIdx(i, 3)};i]; 
end 

作为一个例子,假设

cellPoints = cell(10, 10, 10);% user defined, cannot change 
cellIdx = [1, 3, 2; 
      3, 2, 1; 
      1, 3, 2; 
      1, 4, 2] 

然后

cellPoints{1, 3, 2} = [1;3]; 
cellPoints{3, 2, 1} = [2]; 
cellPoints{1, 4, 2} = [4]; 

和cellPoints的其他指数应为空

仙ce cellIdx是一个大矩阵,这显然是低效的,还有其他更好的实现吗?我试过使用唯一的(cellIdx,'行')在cellIdx中找到唯一行,然后编写for-loop来计算cellPoints,但它比上面慢。

+0

目前尚不清楚你想要什么。发布一些示例输入和输出 – 2015-04-05 23:26:30

+0

@LuisMendo现在提供了一个示例 – luvegood 2015-04-05 23:32:11

+0

将您的代码应用于给定的'cellIdx'不起作用。 'cellPoints'也应该定义为你的代码运行 – 2015-04-05 23:35:16

回答

1

看看这是速度快:

cellPoints = cell(10,10,10); %// initiallize to proper size 
[~, jj, kk] = unique(cellIdx, 'rows', 'stable') 
sz = size(cellPoints); 
sz = [1 sz(1:end-1)]; 
csz = cumprod(sz).'; %'// will be used to build linear index 
ind = 1+(cellIdx(jj,:)-1)*csz; %// linear index to fill cellPoints 
cellPoints(ind) = accumarray(kk, 1:numel(kk), [], @(x) {sort(x)}); 

或者删除sort从最后一行,如果每个单元内顺序并不重要。

+0

非常感谢,这真的有帮助! – luvegood 2015-04-06 00:26:11