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;