【问题标题】:Matlab norm function adds an extra element to a vector?Matlab范数函数向向量添加了一个额外的元素?
【发布时间】:2019-11-28 11:38:21
【问题描述】:

我有一个包含 3 个矩阵的元胞数组(数据),每个矩阵分别有 18 列和 108021、108022 和 108021 行。我需要为每个矩阵计算第 13、14 列和第 15、16 列之间的欧几里得距离,我使用以下代码:

for m = 1:length(data)
 for i = 1:length(data{m})
  distance(i) = norm(data{m}(i,13:14)-data{m}(i,15:16));
 end
end

除了添加额外元素的最后一个矩阵(当 m=3 时)外,它都有效。所以现在距离是一个具有 3 个大小为 108021、108022 和 108022 的向量的元胞数组...

有人知道这里有什么问题吗?

谢谢!

奥赛罗

【问题讨论】:

  • 你不想要像distance{m}(i) = norm(... 这样的东西。现在向量 distance 被每次外部循环迭代覆盖,并且由于中间循环使向量 108022 个元素,它将在最后一次迭代中保持最后一个元素不变,即当 m=3 时。
  • 谢谢!这实际上是问题所在。但是,我不能直接将“距离”作为一个元胞数组,因为我将“movmean”应用于每个距离向量,并且它需要一个数字输入...

标签: matlab euclidean-distance


【解决方案1】:

您可以将distance 变量预分配给一个矩阵并将值存储在那里。

distance = zeros(length(data),max(cellfun('size',data,1)));
for m = 1:length(data)
 for i = 1:length(data{m})
  distance(m,i) = norm(data{m}(i,13:14)-data{m}(i,15:16));
 end
end

或者如果distance 必须是一个元胞数组

for m = 1:length(data)
 for i = 1:length(data{m})
  d{m}(i) = norm(data{m}(i,13:14)-data{m}(i,15:16));
 end
end

【讨论】:

  • 我尝试了第二个选项,它有效。但是,它比这要复杂一些,因为在创建距离后,我应用了一个需要数字输入而不是单元格输入的 movmean...
  • @AugustoEscalante 答案涵盖了您在问题中提到的场景。但是,距离可以是负数吗?如果不是,那么您可以尝试第一个选项并将未使用的元素设置为例如负值。如果是,您可以将其设置为唯一值(例如 pi)。然后你就知道要排除哪些了。
  • 答案很完美,而且很有效。我会按照建议尝试。
猜你喜欢
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
相关资源
最近更新 更多