使用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
。
假设我有一个名为 "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
。