Loren在Matlab的艺术上

将想法转化为matlab

在Matlab中重复索引

索引是A.热门话题我不时写下。今天我想专注于有重复索引时会发生什么。

内容

使用重复索引访问数组元素

假设我想做numdups.在向量中的奇数位置中的元素副本,v

vec = [-40;exp(1);pi;17;42];numdups = 3;Oddlocs = 1:2:长度(VEC);locs = Oddlocs(1,numdups),:);locs = locs(:) newvec = vec(locs(:))
Locs = 1 1 1 1 3 3 3 5 5 5 5 5 emvec = -40.0000 -40.0000 -40.0000 3.1416 3.1416 3.1416 3.1416 42.0000 42.0000 42.0000 42.0000

正如您所看到的,因为我要求一些重复的值,Matlab将它们归还给我。

以防你需要一些澄清,让我解释这里发生了什么。创建我的数组并识别我要重复的值的位置(Oddlocs.),我将此数组重塑为列向量座席子,并使用此阵列具有重复值,以索引到我请求的行中,包括所有列(但在此处只有1列)。

这是一个更简单的例子,我将进一步扩展。

subs = [1;3;3];newvec = vec(潜艇)
newvec = -40.0000 3.1416 3.1416

我创建了我的索引 - 你可以看到我希望第一个元素后跟两次3。让我们从右侧开始。从语义,或意义,Matlab创建一个新的临时阵列提取v要求。在此之后,临时阵列中的值被分配给输出纽维克

以下是如何从复制列创建矩阵。首先是索引,

Threecols = VEC(:,[1 1 1])%或VEC(:,一个(1,numdups)
THREECOLS = -40.0000 -40.0000 -40.0000 2.7183 2.7183 2.7183 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 17.0000 17.0000 17.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000

通过矩阵乘法

Threecols = Vec * [1 1]%或VEC * ONE(1,NUMDUP)
THREECOLS = -40.0000 -40.0000 -40.0000 2.7183 2.7183 2.7183 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 17.0000 17.0000 17.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000

repmat.

Threecols = Repmat(VEC,1,3)
THREECOLS = -40.0000 -40.0000 -40.0000 2.7183 2.7183 2.7183 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 17.0000 17.0000 17.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000 42.0000

您也可能对。。。有兴趣repelem.

请注意,您通常不需要任何可以用较旧的计算有效地完成的计算BSXFUN.,而且,最近,在我看来优雅,隐含的扩张行为(12)您可以使用“展开”单例尺寸。

复制元素用于输出的分配

现在让我们看看如果我们在分配中重复指数,我们需要做些什么。

newvec = vec;newvec(潜水子)= vec(船只)+ 10
newvec = -30.0000 2.7183 13.1416 17.0000 42.0000

您在这里看到的是元素1以10增长10个元素3.但是,我们重复了元素3索引。因此,计算的右侧具有更新元素3的元素1和2份 - 以相同的方式更新,因为代码所做的操作。请记住,我说Matlab行为就像我们将右侧放入临时阵列一样。一旦我们完成计算右侧,Matlab就在分配上工作。头部到底部(即使对于多维数组,也是MATLAB以列主要格式存储数据),并且它用新值替换元素1,具有新值的元素3,然后再次增加后一个时间。元素3没有10s的额外累积,但也许你想积累重复元素的结果,但你可以简单地使用类似的东西浓汤

如何实现累积行为

您现在可以创建和使用Matlab中的矩阵。从doc.,您可以看到在构造稀疏矩阵时可以累计值。这一直很方便,最终我们做出了类似的功能,积累对于非稀疏阵列也是如此。

一个例子的时间。我想计算像VEC(潜水艇)= VEC(潜水艇)+ 10这样的东西,其中差异是我希望重复索引累积重复索引表示的10S数量。

vec =(1:5)'subs = [1;3;3];
vec = 1 2 3 4 5

这是上面的右侧。

VEC(潜艇)
ans = 1 3 3
[unquevals,〜,idxunique] =唯一(潜艇)
UniqueVals = 1 3 idxunique = 1 2 2

请注意,我称之为函数独特并检索第三个输出,在输出中出现的唯一索引的实际位置。

VEC(UniqueVals)= VEC(UniqueVals)+ Accularray(Idxunique,10)
vec = 11 2 23 4 5

最后让我从帖子的开头返回初始向量。我猜你完全明白现在发生了什么。

subs = [1;3;3];vec = [-40;exp(1);pi;17;42];newvec = vec;[uniquesubs,〜,idxunique] =唯一(潜艇); newvec(uniquesubs) = vec(uniquesubs) + accumarray(idxUnique, 10)
newvec = -30.0000 2.7183 23.1416 17.0000 42.0000

处理重复指数时,您在索引挑战是什么?

想知道您是否在处理重复指数时遇到过一些挑战。让我知道这里




发布与MATLAB®R2019B

|
  • 打印
  • 发送电子邮件

注释

要发表评论,请点击这里登录您的MathWorks帐户或创建新的。