罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经退休,不会被更新。

MATLAB中重复索引

索引是一个热门话题我写的时候。今天我想重点当有重复的指标。

内容

访问数组元素的重复指标

假设我想要numdups副本的元素在奇怪的地方在一个向量,vec

vec = [-40;实验(1);π;17;42];numdups = 3;oddlocs = 1:2:长度(vec);loc = oddlocs ((1, numdups),:);loc = loc (:) newvec = vec (loc (:))
loc = 1 1 1 3 3 3 5 5 5 newvec = -40.0000 -40.0000 -40.0000 3.1416 3.1416 3.1416 42.0000 42.0000 42.0000

正如你所看到的,因为我要求一些重复的值,MATLAB归还给我。

以防你需要一些澄清,让我解释这是怎么回事。在创建数组并确定值的位置我想重复(oddlocs),我把这个数组重塑成一个列向量loc,并使用这个数组的重复值,索引到行我请求,包括所有的列(但只有1列)。

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

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

我创建索引,你可以看到,我想第一个元素之后,第三一两次。让我们从右边开始。从语义或意义,MATLAB的角度来看,创建了一个新的临时数组中提取的vec要求。再往下,临时数组中的值被分配到输出newvec

这是如何从复制列创建一个矩阵。首先通过索引,

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 17.0000 17.0000 17.0000 42.0000 42.0000 42.0000

通过矩阵乘法

threecols = vec * (1 1 1)numdups vec * %或1 (1)
threecols = -40.0000 -40.0000 -40.0000 2.7183 2.7183 2.7183 3.1416 3.1416 3.1416 17.0000 17.0000 17.0000 42.0000 42.0000 42.0000

repmat

threecols = repmat(矢量,1,3)
threecols = -40.0000 -40.0000 -40.0000 2.7183 2.7183 2.7183 3.1416 3.1416 3.1416 17.0000 17.0000 17.0000 42.0000 42.0000 42.0000

你可能也会感兴趣repelem

请注意,您通常不需要任何技术对某些计算,可以有效地老来完成bsxfun,最近的,在我看来优雅,隐式扩张行为(1,2),您可以使用“扩大”单维度。

复制的元素赋值输出

现在让我们看看我们需要做的如果我们有重复的指标任务。

newvec =矢量;newvec vec(潜艇)+(潜艇)= 10
newvec = -30.0000 2.7183 13.1416 17.0000 - 42.0000

你在这里看到是相同元素1增长了10和元素3。然而,我们有重复元素3指数。所以计算右边元素1和2的副本更新3 -更新每个以同样的方式,因为这是说的代码做什么。还记得我说过,MATLAB行为就好像我们右边放置到一个临时数组中。一旦我们完成了计算右边,MATLAB在分配工作。头从上到下(即使对于多维数组,因为MATLAB将数据存储在一个列为主的格式),和一个新值,它取代元素1元素3与一个新值,然后做后者。没有额外的10年代积累元素3。但也许你想积累的结果重复的元素,但它不是如此整洁,您可以简单地使用类似cumsum

如何实现积累行为

也许你现在可以创建和使用稀疏的在MATLAB矩阵。从医生时,你可以看到,你可以积累值构造一个稀疏矩阵。这是方便的,最终我们做了一个类似的功能,accumarraynon-sparse数组。

一个例子的时候了。我想计算类似vec(潜艇)= vec(潜艇)+ 10的区别在于,我想重复指标的数量积累10所代表的重复指标。

vec =(1:5)的潜艇= [1;3;3);
vec = 1 2 3 4 5

这是右边。

vec(潜艇)
ans = 1 3 3
[uniquevals, ~, idxUnique] =独特(潜艇)
uniquevals = 1 3 idxUnique = 1 2 2

注意,我调用这个函数独特的的实际位置和检索第三输出,独特的指标,因为他们出现在输出。

vec (uniquevals vec (uniquevals) =) + accumarray (idxUnique, 10)
vec 23 = 11 2 4 5

终于让我回到初始矢量从一开始的。我猜你现在完全明白这里发生了什么。

潜艇= [1;3;3);vec = [-40;实验(1);π;17;42];newvec =矢量;[uniquesubs, ~, idxUnique] =独特(潜艇); newvec(uniquesubs) = vec(uniquesubs) + accumarray(idxUnique, 10)
newvec = -30.0000 2.7183 23.1416 17.0000 - 42.0000

你的索引挑战在处理重复的指标是什么?

想知道你这里有一些挑战没有覆盖在处理重复的指标。请让我知道在这里




发表与MATLAB®R2019b

|
  • 打印
  • 发送电子邮件