You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab中sub2ind索引与P(i,j)常规索引结果为何不同?

两种赋值方式结果差异的原因分析

核心原因是Matlab对重复索引的批量赋值和循环逐次赋值的执行逻辑完全不同:

  • 循环方式:P(angles(k), r(k)) = P(angles(k), r(k)) + 1
    每一次循环都会先读取当前位置的最新值,加1后再写回去。如果同一个坐标出现两次,第一次执行后值从0变1,第二次执行时读取1再加1,最终得到2。

  • sub2ind批量赋值方式:P(indices) = P(indices) + 1
    Matlab会先一次性计算右边的所有值:先读取P(indices)的初始值(全0),每个元素加1得到一个和indices长度相同的数组(比如重复的索引对应的值都是1),然后把这个数组的元素依次赋值到indices指向的位置。如果同一个索引出现多次,后面的赋值会覆盖前面的,最终这个位置只会保留最后一次的赋值结果(也就是1)。

举个具体例子:假设angles和r里两次出现(2,6),对应的indices里有两个相同的索引值:

  1. 批量赋值时,右边先算出两个0+1=1,然后依次把这两个1赋值到P(2,6),最后P(2,6)是1
  2. 循环时,第一次执行P(2,6)=0+1=1,第二次执行P(2,6)=1+1=2,最终得到2

如果想用sub2ind思路实现和循环一样的累加效果,推荐用accumarray函数:

counts = accumarray([angles, r], 1, size(P));
P = P + counts;

或者用稀疏矩阵转换:

P = P + full(sparse(angles, r, 1, size(P,1), size(P,2)));

内容的提问来源于stack exchange,提问作者euraad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:34:53