使用matlab索引矩阵中的行

indexing rows in matrix using matlab

假设我有一个名为 "cellPoints" 的空 m×n×p 维单元格,我还有一个名为 "cellIdx" 的 D×3 维数组,其中每一行我包含 "cellPoints" 中的下标。现在我想计算 "cellPoints" 以便 cellPoints{x, y, z} 包含 "cellIdx".

中的行号数组

一个天真的实现可能是

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 的其他索引应该为空

由于cellIdx是一个大矩阵,这显然效率低下,还有其他更好的实现方式吗?

我尝试过使用 unique(cellIdx, 'rows') 在 cellIdx 中查找唯一行,然后编写一个 for 循环来计算 cellPoints,但它比上面的还要慢。

看看这是否更快:

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