Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB与pdist结合使用自定义函数_Matlab_Pdist - Fatal编程技术网

MATLAB与pdist结合使用自定义函数

MATLAB与pdist结合使用自定义函数,matlab,pdist,Matlab,Pdist,我有一个自定义函数来计算代表图像图上节点的两个像素之间的权重 function [weight] = getWeight(a,b,img, r, L) ac = num2cell(a); bc = num2cell(b); imgint1 = img(sub2ind(size(img),ac{:})); imgint2 = img(sub2ind(size(img),bc{:})); weight = (sum((a - b) .^ 2) + (r^2/

我有一个自定义函数来计算代表图像图上节点的两个像素之间的权重

function [weight] = getWeight(a,b,img, r, L)
    ac = num2cell(a);
    bc = num2cell(b);
    imgint1 = img(sub2ind(size(img),ac{:})); 
    imgint2 = img(sub2ind(size(img),bc{:}));
    weight = (sum((a - b) .^ 2) + (r^2/L) * abs(imgint2 - imgint1)) / (2*r^2);
其中a=[x1 y1]和b=[x2 y2]是表示图像像素的坐标,img是灰度图像,r和L是常数。在函数imgint1和imgint2中,是a和b上像素的灰度

我需要计算图像的一组点之间的权重

我想使用pdist函数,而不是两个嵌套的循环,因为它要快得多

例如,让节点具有一组像素坐标

nodes  =
 1     1
 1     2
 2     1
 2     2
和img=[128254;0255],r=3,L=255

为了得到这些权重,我使用了一个中间函数

function [weight] = fxIntermediate(a,b, img, r, L)

    weight = bsxfun(@(a,b) getWeight(a,b,img,r,L), a, b);
为了最终得到整套权重

distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L));
但它总是给我一个错误

Error using pdist (line 373)
Error evaluating distance function '@(XI,XJ)fxIntermediate(XI,XJ,img,r,L)'.

Error in obtenerMatriz (line 27)
    distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L));

Caused by:
    Error using bsxfun
    Invalid output dimensions.
编辑1

这是我的代码的一个简短示例,它应该可以工作,但是我得到了上面提到的错误。如果在MATLAB上复制/粘贴代码并运行代码,您将看到错误

function [adjacencyMatrix] = problem
    img = [123, 229; 0, 45];                % 2x2 Image as example
    nodes  = [1     1;  1     2; 2     2];  % I want to calculate distance function getWeight()
                                            % between pixels img(1,1), img(1,2), img(2,2) 
    r = 3;                                  % r is a constant, doesn't matter its meaning
    L = 255;                                % L is a constant, doesn't matter its meaning

    distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L)); 
    adjacencyMatrix = squareform(distNodes );
end

function [weight] = fxIntermediate(a,b, img, r, L)
    weight = bsxfun(@(a,b) getWeight(a,b,img,r,L), a, b);
end

function [weight] = getWeight(a,b,img, r, L)
    ac = num2cell(a);
    bc = num2cell(b);
    imgint1 = img(sub2ind(size(img),ac{:})); 
    imgint2 = img(sub2ind(size(img),bc{:}));
    weight = (sum((a - b) .^ 2) + (r^2/L) * abs(imgint2 - imgint1)) / (2*r^2);
end
我的目标是获得表示像素之间距离的邻接矩阵。对于上述示例,所需的邻接矩阵为:

adjacencyMatrix =    
          0         0.2634     0.2641
          0.2634    0          0.4163
          0.2641    0.4163     0

问题在于,您既没有满足将与pdist一起使用的函数的期望,也没有满足将与bsxfun一起使用的函数的期望

–根据pdist文件:

距离函数必须是形式的

d2=distfunXI,XJ

以1- n向量席作为参数,对应于一行 和一个m2×n矩阵XJ,对应于X的多行。 distfun必须接受具有任意行数的矩阵XJ。 distfun必须返回距离d2的m2×1向量,其kth 元素是席和XJK之间的距离,是:

但是,通过在fxIntermediate中使用bsxfun,此函数始终返回一个值矩阵,其大小为两个输入的大小中的较大值

–来自bsxfun的文档:

形式为C的二元元素函数 =funA,B接受大小任意但相等的数组A和B,并返回大小相同的输出。输出数组C中的每个元素都是 对A和B的相应元素进行操作的结果 只有fun还必须支持标量扩展,例如如果A或B是 标量,C是将标量应用于 其他输入数组

但是,getWeight似乎总是返回标量


为了修复这个问题,我对你的问题了解不够。此外,我认为如果你追求的是速度,那么给pdist提供一个函数句柄就不是一个好办法。pdist不表演魔术;它之所以快速,是因为其内置的距离函数得到了有效实现。此外,您正在使用匿名函数句柄以及与单元格数组之间的转换,所有这些都会降低进程的速度。我认为你应该发布一个新的问题,从描述你试图计算什么开始,包括一些即使效率低下也能完成这项工作的代码,并询问如何改进

请提供一个最小、完整且可验证的示例。请特别注意,缺少img、R和L的值。@A.Donda我添加了其他参数A 2x2图像img=[128 254;0 255],R=3,L=55的值,我希望现在可以清楚。如果你能帮助我,我将不胜感激。谢谢,但仍然有未定义的变量:ac和bc。编写代码以便我们重现您的问题,但没有其他问题:-@Donda很抱歉我的信息不完整。我编辑以放置de ac、bc变量。我希望它会更清楚,我真的需要解决这个问题。泽洛斯,我仍然无法重现你的问题。请在您的问题中包含一个或多个与一个或多个m文件相对应的代码部分,我们可以复制、粘贴并运行这些代码部分,这样它将导致您想要解决的错误,而不会导致其他错误。感谢您的帮助,很遗憾,我没有得到解决方案,但您帮了我很多。fxIntermediate确实返回一个矩阵,我想找到一种方法来避免这个中间函数。现在,我将实现for循环版本,谢谢