具有不同非单态维数的MATLAB bsxfun

具有不同非单态维数的MATLAB bsxfun,matlab,histogram,vectorization,intersection,bsxfun,Matlab,Histogram,Vectorization,Intersection,Bsxfun,我有两组(50列和25个测试)大小为42的直方图。(这些数字是任意的,事实上它们会大得多,所以我正在寻找一种有效的方法。另外,在转置方面,约定可能是相反的,所以可以随意使用任何约定[feature x observation]或[observation x feature]) 所以x1的大小是[42,50],而x2的大小是[42,25]。我想计算大小为[50,25]的直方图相交核。直方图相交核是指包含两个直方图最小元素的向量之和。如何使用MATLAB实现这一点 我尝试了k=sum(bsxfun(

我有两组(50列和25个测试)大小为42的直方图。(这些数字是任意的,事实上它们会大得多,所以我正在寻找一种有效的方法。另外,在转置方面,约定可能是相反的,所以可以随意使用任何约定[feature x observation]或[observation x feature])

所以
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.

谢谢你的帮助

您需要一个大小为
[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);

那么,包含在
x1
中但不包含在
x2
中的元素会发生什么情况呢。例如,
x1(42,50)=1984
x2(42,50)
不存在。这个指数应该被认为是1984年还是0?@thewaywewalk我不确定我是否正确地理解了你,但是,这应该是无关紧要的。因为我想对
x2
中的25个样本与
x1
中的50个样本的相似性进行编码,因此是50x25内核。在训练内核中,它将是50x50,因为
x2=x1
。好吧,我误解了你的问题。谢谢!但是这个代码示例生成了一个大小为
1x25x42
@halilpazarlama的
k
:忘记了最后一行中的
3
,它告诉
sum
在第三维度中进行总结。亲爱的@Daniel,我还有一个问题。当我将这段代码应用到我的真实测试用例中,其中特征维度为3700,样本数为2700时,我的计算机(带有12GB RAM)给出了错误:
使用bsxfun时出错。内存不足。为您的选项键入帮助记忆。
。有什么方法可以进一步提高内存效率**编辑:*我做了实验,发现我能使用的功能最多有400个左右。所以我想我在要求一个奇迹:)但也许有一种方法,比如并行编程,使用GPU等等。我插入了一个中间步骤来更好地解释这个问题。您的输入矩阵x1和x2的大小都是[37002700],这不是问题,这是76MiB,但bsxfun返回的中间结果的大小是[370037002700],需要276GiB。您的最终结果大小为[3703703700],因此在标准PC上应该可以执行此操作。我没有找到解决内存问题的好方法。因为原来的问题已经得到了回答,而你也接受了答案,可能没有其他人会看这个。我建议创建一个新问题。