Bug when using min() with sparse matrices?

조회 수: 1 (최근 30일)
Ingo
Ingo 2012년 1월 8일
편집: James Tursa 2024년 1월 28일
Hi,
I translated one of my Matlab routines to C and now I've encountered a really strange behaviour which seems to be a bug. M is a sparse matrix and I printed M, M', min(M, M') and min(full(M), full(M')), but all of them as full matrices to see the problem better:
The last matrix is what I want and what I'm supposed to already get by using min(M, M'), but for some reason min(M, M') shows some really weird behaviour. Any gueses what causes this?
Edit: Here's the mex file:
#include "mex.h"
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray *prhs[])
{
mxArray *tempArray, *outputDist[1], *inputDist[2], *outputSort[2];
double *tempVal, *pr, *sr, *sorted, *order;
mwSize n, nzmax;
mwIndex *irs, *jcs, i, j, k;
// distance function call
tempArray = mxCreateDoubleMatrix(1, 1, mxREAL);
tempVal = mxGetPr(tempArray);
inputDist[0] = prhs[0];
inputDist[1] = tempArray;
// read input matrix size
n = mxGetN(prhs[0]);
// read real part of input matrix
pr = mxGetPr(prhs[0]);
// read parameter for k
k = (mwIndex)*mxGetPr(prhs[1]);
// create output sparse matrix
nzmax = (mwSize)(n*k);
plhs[0] = mxCreateSparse(n, n, nzmax, mxREAL);
sr = mxGetPr(plhs[0]);
irs = mxGetIr(plhs[0]);
jcs = mxGetJc(plhs[0]);
// go through data points
for (i = 0; i < n; i++)
{
// calculate distance vector
tempVal[0] = (double)(i+1);
mexCallMATLAB(1, outputDist, 2, inputDist, "distEuclidean2");
// sort vector
mexCallMATLAB(2, outputSort, 1, &outputDist[0], "sort");
sorted = mxGetPr(outputSort[0]);
order = mxGetPr(outputSort[1]);
// assign values to sparse matrix
jcs[i] = i*k;
for (j = 0; j < k; j++)
{
irs[i*k+j] = (mwIndex)(order[j]-1);
sr[i*k+j] = sorted[j];
}
}
jcs[n] = n*k;
}
And here is the called distEuclidean2:
function [ d ] = distEuclidean2( M, ii )
d = sqrt(sum((repmat(M(:, ii), 1, size(M, 2)) - M) .^ 2, 1));
emd
  댓글 수: 6
Walter Roberson
Walter Roberson 2012년 1월 9일
Suggest you edit the source in to your Question, as comments don't support formatting (or indentation even)
Ingo
Ingo 2012년 1월 9일
I added the mex source code now. The function is called with a d-by-n matrix of n data points and a number k as the second parameter. It then calculates the n-by-n distance matrix, but only keeps the k smallest distances, all other values are set to zero (thus making it sparse).
I added distEuclidean2.m as well. I compile the mex file with "mex filename.c -largeArrayDims" and I'm running a 64-bit Matlab. One can then run it with
A = (1:5);
M = whateveryoucalledit(A, 3);
for example.

댓글을 달려면 로그인하십시오.

채택된 답변

James Tursa
James Tursa 2012년 1월 9일
편집: James Tursa 2024년 1월 28일
You might try using this to check the matrix:
href=""<http://www.mathworks.com/matlabcentral/fileexchange/20186-spok-checks-if-a-matlab-sparse-matrix-is-ok</a>>
Not sure if it works for 64-bit.
*** EDIT ***
Note that spok has been removed from the FEX. You can use my replacement function sarek instead:
  댓글 수: 1
Ingo
Ingo 2012년 1월 9일
Thanks. I could use it by modifying the installation to 64-bit. I knew about having explicit zero entries (didn't they they'd be a problem), but I also have row index problems. After using M = 1*M and M = M'' the min(M, M') command works. Now I know where the problem is!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Sparse Matrices에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by