【问题标题】:Struct data assignment结构数据赋值
【发布时间】:2017-05-01 09:29:09
【问题描述】:

我正在尝试计算结构数据类型的距离。

距离法是:

 function ssd=distances(x, c)
   m=size(x,1);
   ssd = zeros(m, k);
   k=size(c,1);

  for i= 1:k
   z = bsxfun(@minus,x, c(i,:));
   ssd(:,i) = sqrt(z(:).^2,2);
 end

然后我有c,这是一个由以下公式产生的随机数:

for i=1:20
  pop(i).Position=unifrnd(2,2,4);
  pop(i).dist=distances(x= data,pop(i).Position=c);
end 

x = 数据为 100x2。

问题是当我调用 distance 方法时它不接受传递的参数 pop(i).position

【问题讨论】:

  • 哪个参数?此外,您使用的变量 k 在我能看到的任何地方都没有定义。请编辑您的问题以澄清。
  • 为什么你的函数调用中有x = =cdistances(data, pop(i).Position)呢?
  • @Suever 是的,只是为了解释 x 是数据,c 是 pop(i).position
  • 您的实际错误信息是什么?
  • @Suever 错误是:Error using sqrt Too many input arguments.

标签: matlab struct


【解决方案1】:

我可以提出的几个错误和建议:

  1. sqrt 函数只接受单个输入参数。您正在指定两个输入参数。

  2. 您也没有正确计算 SSD。当您执行z = bsxfun(...); 时,您只是在计算data 和您的输入查询点c(i, :) 之间的组件距离。您还必须sum所有组件距离。这可能就是您的 sqrt 函数调用错误的原因,因为您可能还打算在 sqrt 之外添加一个 sum

    ssd(:, i) = sqrt(sum(z.^2, 2));
    

    顺便说一句,平方差之和传统上不包括 sqrt 运算....这就是为什么它被称为 平方 差的 sum

  3. 你的主循环中的这段代码也没有任何意义:

    pop(i).dist=distances(x= data,pop(i).Position=c)
    

    我的猜测是您来自 Python 背景,您可以将输入指定为键值对。不要那样做。做吧:

    pop(i).dist = distance(data, pop(i).Position);
    
  4. 此代码pop(i).Position=unifrnd(2,2,4); 将在 2 和 2 的值之间生成一个 4 x 4 矩阵...这没有意义。您可能想要生成一个4 x 2 矩阵来匹配您的数据所具有的特征数量。使用其他东西并使随机数的范围更大。要将其发送到4 x 2,请指定一个附加参数。像这样的东西可以工作:

    pop(i).Position = unifrnd(2, 10, 4, 2);
    

【讨论】:

  • 我已经按照您的建议进行了更改,但仍然有错误 Error using bsxfun 两个输入数组的非单一维度必须相互匹配。
  • z = bsxfun(@minus,x, c(i,:));
  • 检查编辑。特别是#4。您对unifrnd 的调用完全没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2012-01-25
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多