在Matlab中,find()函数的逆函数是什么?

4
在Matlab中,我可以像这样查找向量中的所有非零条目:
>> v = [0 1 0 0 1]

v =

     0     1     0     0     1

>> indices = find(v)

indices =

     2     5

假设我的向量v只能有01的值,那么从indices向量中复制v有什么简单方法吗?

2
你怎么知道 indices 中的 v 的大小?在你的例子中,v = [0 1 0 0 1 0] 也是一个解决方案。 - Luis Mendo
2个回答

7

你需要知道形状v是什么(例如,如果它是向量,则需要知道v有多长),但一旦你知道了这一点,就很简单了:

n = 5;
v_reconstructed = zeros(1, n);
v_reconstructed(indices) = 1;

如果你不知道 v 的长度,那么你就不能捕获在 v 中最后一个 1 后面的任何 0

顺便说一下,如果你正在使用稀疏矩阵,那么你可能需要这个:

v = sparse([0 1 0 0 1]);
v_reconstructed = full(v);

2
在第二行中,v_reconstructed(n) = 0; 可能更快。 - Luis Mendo
1
那么你怎么知道n等于5呢? - Sam Roberts
2
@SamRoberts 我假设你知道 v 的长度,也许它与你拥有的另一个向量长度相同,或者 n 已知,但由于某种原因 v 本身不存在 :/ 基本上我认为对 n 的了解比对 v 的了解要少严格一些。 - Dan
2
@Dan 好的,我想那是真的。无论如何,建议在这里,以防您确实有“v”可用。 - Sam Roberts
2
@Sam 如果你有v,解决方案是 v_reconstructed = v; :-) - Luis Mendo
显示剩余5条评论

6

我曾经使用sparse和full,但现在我转换到了accumarray,因为它的格式更简单。

在你的例子中:

   v=accumarray([2;5],1)'

此外,根据第一个Matlab示例,您还可以循环值(我认为)。
Create a 5-by-1 vector, summing values for repeated 1-D subscripts:
   subs = [1; 2; 4; 2; 4];
   A = accumarray(subs, 101:105)

当然,根据其名称,该函数是用于执行更高级的操作。

这个答案更好,因为它适用于N-D矩阵索引。2-D示例:accumarray([1,3;2,4],1) == [0,0,1,0;0,0,0,1]。这可能不包括行或列,但使用逻辑索引时,它将假定那里都是零/假。 - MathIsKey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接