【问题标题】:How to vectorize sub2ind?如何矢量化 sub2ind?
【发布时间】:2015-12-19 13:05:51
【问题描述】:

我有一个二维数组 L,我正在尝试为该数组的每一行创建一个线性索引向量 ind

L=
1 5 25 4 0 0 
2 3 3 45 5 6
45 5 6 0 0 0

我正在使用lenr 存储每行中非零元素的数量(从第 1 列开始)。

lenr=
4
6
3

然后我有 1x45 数组 RULES。存储在L 中的索引引用RULES 中的元素。由于我想对代码进行矢量化,我决定创建线性索引,然后运行RULES(ind)

这很好用:

ind=sub2ind(size(L),1,lenr(1));

虽然这不起作用:

ind=sub2ind(size(L),1:3,1:lenr(1:3));

有什么想法吗?

更新:

这是我最初尝试对代码进行矢量化的方法,但它不起作用,这就是我检查线性索引的原因:

rul=repmat(RULES,3);
result = rul((L(1:J,1:lenr(1:J))));

【问题讨论】:

  • 请提供一个完整的示例并解释您要做什么。
  • @excaze:看看我的更新。
  • 你为什么用1:lenr(1:3)而不是lenr(1:3)
  • @excaza:我使用 1:lenr(1:3) 来获取从 1 到每行对应长度的 L 个元素(lenr 包含不包括 0 的长度)。
  • 这里让我你 - allind = reshape(1:numel(L),size(L,1),[]) 然后ind = allind(L~=0)。虽然没有测试。

标签: matlab vectorization


【解决方案1】:

如果我正确解释了您的编辑,您希望创建一个变量result,其中包含RULES 的元素,由L 的非零元素指示。请注意,一般来说,矢量化sub2ind 的最佳方法是不使用sub2ind

如果你想让result成为一个线性数组,你可以简单地写

%// transpose so that result is ordered by row
L_transposed = L.'; 
result = RULES(L_transposed(L_transposed>0));

如果您希望result 是一个与L 大小相同的数组,并将L 中的所有数字替换为RULES 中的相应元素,那就更简单了:

result = L;
result(result>0) = RULES(result>0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2017-06-18
    • 2018-03-15
    • 2017-03-13
    相关资源
    最近更新 更多