【问题标题】:MATLAB bsxfun with different non-singleton dimensions具有不同非单一维度的 MATLAB bsxfun
【发布时间】:2015-08-02 11:40:33
【问题描述】:

我有两组(50 个训练和 25 个测试)大小为 42 的直方图。(这些数字是任意的,它们在现实中会更大,所以我正在寻找一种有效的方法。而且约定可能是相反的就转置而言,请随意使用任何约定 [特征 x 观察] 或 [观察 x 特征])

所以x1 的大小为[42, 50],而x2 的大小为[42, 25]。我想计算大小为[50, 25] 的直方图交叉核。直方图交叉核是指包含两个直方图的最小元素的向量的总和。如何使用 MATLAB 做到这一点?

我尝试了k=sum(bsxfun(@min, x1,x2));(带有转置变体)但我得到了错误:

Error using bsxfun
Non-singleton dimensions of the two input arrays must match each other.

感谢您的帮助!

【问题讨论】:

  • 那么x1 中包含但x2 中不包含的元素会发生什么。例如 x1(42,50) = 1984x2(42,50) 不存在。该索引应该被视为 1984 还是 0
  • @thewaywewalk 我不确定我是否理解正确,但是,这应该无关紧要。因为我想编码x2 中的 25 个样本与x1 中的 50 个样本的相似程度,因此是 50x25 内核。在训练内核中,它将是 50x50,因为x2=x1
  • 好吧,我误解了你的问题。

标签: matlab histogram vectorization intersection bsxfun


【解决方案1】:

您想要一个大小为[50,25] 的输出,该输出已经汇总。 bsxfun 的输出应该是 [50,25,42] 的尺寸,这意味着除了单件尺寸外,所有输入都必须是这个尺寸。您的[42, 50] 需要置换为[50,1,42],第二个输入需要置换为[1,25,42]

x1=rand(42,50);
x2=rand(42,25);
x1=permute(x1,[2,3,1]);
x2=permute(x2,[3,2,1]);
t=bsxfun(@min, x1,x2);
k=sum(t,3);

【讨论】:

  • 谢谢!但是此代码示例会生成大小为 1x25x42k
  • @halilpazarlama:忘记了最后一行中的3,它告诉sum在第三维中进行总结。
  • 亲爱的@Daniel,我还有一个问题。当我将此代码应用于我的真实测试用例时,其中特征维度为 3700,样本数为 2700,我的计算机(具有 12GB RAM)给出错误:Error using bsxfun. Out of memory. Type HELP MEMORY for your options.。有什么方法可以进一步提高内存效率吗? **编辑:**我进行了实验并看到了最大值。我可以使用的功能数量大约是 400。所以我想我在寻求奇迹 :) 但也许有一种方法,比如并行编程,使用 GPU 等。
  • 我插入了一个中间步骤来更好地解释问题。您的输入矩阵 x1 和 x2 的大小均为 [3700,2700],这不是问题,即 76MiB,但 bsxfun 返回的中间结果的大小为 [3700,3700,2700],需要 276GiB。您的最终结果大小为 [3700,3700],因此应该可以在标准 PC 上执行此操作。
  • 我没有找到解决内存问题的好方法。由于原始问题已经回答并且您接受了答案,因此可能没有其他人会看这个。我建议创建一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多