我有一个 12x202 矩阵(12 个实例,有 202 个特征)。我想计算每 12 个实例之间的马氏距离,但似乎列数不能大于实例数(行)。(我在计算 12x11 矩阵的距离时没有问题,但超过 11 个特征会在 MATLAB 中使用linkage(X,'ward','mahalanobis');
ormahal(X,X);
或导致错误pdist2(X,X,'mahalanobis');
)
matlab - 矩阵 (mxn) 的马氏距离 m<
我有一个 12x202 矩阵(12 个实例,有 202 个特征)。我想计算每 12 个实例之间的马氏距离,但似乎列数不能大于实例数(行)。(我在计算 12x11 矩阵的距离时没有问题,但超过 11 个特征会在 MATLAB 中使用linkage(X,'ward','mahalanobis');
ormahal(X,X);
或导致错误pdist2(X,
问问题
371 次
Cygwin 链接共享库
更新:
删除了关于 .so 文件的旧问题。它们不适用于 Windows。
我使用头文件解决了以下问题。我猜每次使用 C++ 链接时使用 .h 文件是一种标准约定吗?
mydll.h:
#ifndef mydll_h_
#define mydll_h_
void hello();
#endif
myprog.cc:
#include "mydll.h"
int main ()
{
hello ();
return 0;
}
mydll.cc:
#include <iostream>
void hello()
{
std::cout << "Hello World!\n";
}
或者,我在本指南中尝试使用 Cygwin 的 .dll 库:https ://cygwin.com/cygwin-ug-net/dll.html
他们的 .c 文件的编译工作,但我试图让它为我的 .cc 文件工作。有任何想法吗?
mydll.cc:
#include <iostream>
void hello()
{
std::cout << "Hello World!\n";
}
myprog.cc:
int main ()
{
hello ();
return 0;
}
我输入:
g++ -c mydll.cc
g++ -shared -o mydll.dll mydll.o
但是当我输入:
g++ -o myprog myprog.cc -L./ -lmydll
我得到:
myprog.cc: In function ‘int main()’:
myprog.cc:4:10: error: ‘hello’ was not declared in this scope
hello ();
4
1 回答
0
如果您查看mahal 函数的matlab 文档,它会显示:
X 和 Y 必须具有相同的列数,但可以具有不同的行数。X 的行数必须多于列数。
我的统计不太好,所以我不确定为什么这个条件很重要,但我认为这是出于效率原因,而且 12 项措施的数量太少,所以考虑采取更多措施。
您可以做的事情是自己计算马哈拉巴尼距离,很容易在同一个文档中获得公式,并且给出的示例可以更好地计算马哈拉巴尼距离:
马氏距离也称为二次距离。它测量两组对象的分离。假设我们有两组均值 和 ,马氏距离由下式给出
不同的群体也是如此,而不是相同的群体。
在任何情况下,您都可以使用它:
function MD = my_MahalanobisDistance(X, Y)
[nX, mX] = size(X);
[nY, mY] = size(Y);
n = nX + nY;
if(mX ~= mY)
disp('Columns in X must be same as in Y')
else
xDiff = mean(X) - mean(Y);
cX = my_covariance(X);
cY = my_covariance(Y);
pC = nX/n*cX + nY/n*cY;
MD = sqrt(xDiff * inv(pC) * xDiff');
end
对于协方差:
function C = my_covariance(X)
[n,m] = size(X);
Xc = X -repmat(mean(X),n,1);
C = Xc'* Xc/n;
我希望这对你有帮助
于 2016-08-25T08:17:58.880 回答
我有一个 12x202 矩阵(12 个实例,有 202 个特征)。我想计算每 12 个实例之间的马氏距离,但似乎列数不能大于实例数(行)。(我在计算 12x11 矩阵的距离时没有问题,但超过 11 个特征会在 MATLAB 中使用linkage(X,'ward','mahalanobis');
ormahal(X,X);
或导致错误pdist2(X,
Cygwin 链接共享库
更新:
删除了关于 .so 文件的旧问题。它们不适用于 Windows。
我使用头文件解决了以下问题。我猜每次使用 C++ 链接时使用 .h 文件是一种标准约定吗?
mydll.h:
#ifndef mydll_h_
#define mydll_h_
void hello();
#endif
myprog.cc:
#include "mydll.h"
int main ()
{
hello ();
return 0;
}
mydll.cc:
#include <iostream>
void hello()
{
std::cout << "Hello World!\n";
}
或者,我在本指南中尝试使用 Cygwin 的 .dll 库:https ://cygwin.com/cygwin-ug-net/dll.html
他们的 .c 文件的编译工作,但我试图让它为我的 .cc 文件工作。有任何想法吗?
mydll.cc:
#include <iostream>
void hello()
{
std::cout << "Hello World!\n";
}
myprog.cc:
int main ()
{
hello ();
return 0;
}
我输入:
g++ -c mydll.cc
g++ -shared -o mydll.dll mydll.o
但是当我输入:
g++ -o myprog myprog.cc -L./ -lmydll
我得到:
myprog.cc: In function ‘int main()’:
myprog.cc:4:10: error: ‘hello’ was not declared in this scope
hello ();
1 回答
如果您查看mahal 函数的matlab 文档,它会显示:
X 和 Y 必须具有相同的列数,但可以具有不同的行数。X 的行数必须多于列数。
我的统计不太好,所以我不确定为什么这个条件很重要,但我认为这是出于效率原因,而且 12 项措施的数量太少,所以考虑采取更多措施。
您可以做的事情是自己计算马哈拉巴尼距离,很容易在同一个文档中获得公式,并且给出的示例可以更好地计算马哈拉巴尼距离:
马氏距离也称为二次距离。它测量两组对象的分离。假设我们有两组均值 和 ,马氏距离由下式给出
不同的群体也是如此,而不是相同的群体。
在任何情况下,您都可以使用它:
function MD = my_MahalanobisDistance(X, Y)
[nX, mX] = size(X);
[nY, mY] = size(Y);
n = nX + nY;
if(mX ~= mY)
disp('Columns in X must be same as in Y')
else
xDiff = mean(X) - mean(Y);
cX = my_covariance(X);
cY = my_covariance(Y);
pC = nX/n*cX + nY/n*cY;
MD = sqrt(xDiff * inv(pC) * xDiff');
end
对于协方差:
function C = my_covariance(X)
[n,m] = size(X);
Xc = X -repmat(mean(X),n,1);
C = Xc'* Xc/n;
我希望这对你有帮助