Dear all,
I am struggling over a small issue that i am not getting able to find. In fact, i have a matrix M. I am planning to find the location(i,j) of the minimum value of the matrix. For, i wrote a function that is not quite working. Please, find the function below:
proc (1) = finder(aMatrix);
local row, col, a_vec,minVal, idx, transMat;
a_vec = vec(aMatrix);
row = rows(aMatrix);
col = cols(aMatrix);
idx = {};
minVal = minC(a_vec);
a_vec = (a_vec .== minVal);
transMat = reshape(a_vec,row,col);
for i(1,row,1);
for j(1,col, 1);
if transMat[i,j] == 1;
idx = {i,j}; // The problem is coming from here. But, it
// work if replace{i,j} by {1,1},{0,1) or any values
endif;
endfor;
endfor;
retp(idx);
endp;
Thanks for your help
1 Answer
0
Problem with your procedure
The problem with this line in your procedure
idx = {i,j};
is that GAUSS, for historical reasons, allows you to put characters inside of a matrix. So the line above is actually embedding the i
and j
inside of a matrix element.
Solution for this problem
You can resolve this problem by using one of the concatenation operators
// This will create a 2x1 column vector
idx = i | j;
// This will create a 1x2 row vector
idx = i ~ j;
Simpler solution
However, you can create an even simpler solution by using the minindc
function. Here is a simple example
new;
// Simple matrix for testing
M = { 1 2 -11 5,
9 0 2 -8,
0 1 -9 4 };
// Find the index of the minimum values
{ r, c } = minIdx(M);
print r;
print c;
proc (2) = minIdx(x);
local r, c;
// 1. Compute the minimum value for each row
// 2. Then find the index of the smallest value
// from the row minimums
r = minindc(minc(x'));
// 1. Compute the minimum value for each column
// 2. Then find the index of the smallest value
// from the column minimums
c = minindc(minc(x));
retp(r, c);
endp;
Your Answer
1 Answer
Problem with your procedure The problem with this line in your procedure
idx = {i,j};
is that GAUSS, for historical reasons, allows you to put characters inside of a matrix. So the line above is actually embedding the i
and j
inside of a matrix element.
Solution for this problem
You can resolve this problem by using one of the concatenation operators
// This will create a 2x1 column vector
idx = i | j;
// This will create a 1x2 row vector
idx = i ~ j;
Simpler solution
However, you can create an even simpler solution by using the minindc
function. Here is a simple example
new;
// Simple matrix for testing
M = { 1 2 -11 5,
9 0 2 -8,
0 1 -9 4 };
// Find the index of the minimum values
{ r, c } = minIdx(M);
print r;
print c;
proc (2) = minIdx(x);
local r, c;
// 1. Compute the minimum value for each row
// 2. Then find the index of the smallest value
// from the row minimums
r = minindc(minc(x'));
// 1. Compute the minimum value for each column
// 2. Then find the index of the smallest value
// from the column minimums
c = minindc(minc(x));
retp(r, c);
endp;