矩阵的边界值问题

时间:2014-03-11 21:58:58

标签: matlab matrix

问题:我需要在[-1,1]范围内钳制P矩阵的每个元素。我使用了提供的代码MinMaxCheck,但此代码仅适用于矢量。所以,我已将其修改为矩阵工作。修改后的功能代码MinMaxCheckMatrix仅更改第一列,但不检查第二列元素,也不检查第二列元素。我无法理解为什么整个P矩阵不会受到影响。请帮忙纠正。

 SomeVector =     [20 0
                     -20 1
                      5 0.9
                      1.1 0.2
                      10  20];

 for rows =1:5
  P(rows,:) = SomeVector;
  min_range(rows,:)=-1;
  max_range(rows,:)=1;
end
 P = MinMaxCheckMatrix(min_range, max_range, P);

**Function**
function [ A2comp ] = MinMaxCheckMatrix( minimum, maximum, A2comp )
[row col] = size(minimum);

for i=1:row
    for j=1:col
        if(maximum(i,j)<A2comp(i,j)||minimum(i,j)>A2comp(i,j))
            if(maximum(i,j)<A2comp(i,j))
                A2comp(i,j)=maximum(i,j);
            else A2comp(i,j)=minimum(i,j);
            end
        end
   end
end


This is the result that I got:

P =

    1.0000         0
   -1.0000    1.0000
    1.0000    0.9000
    1.0000    0.2000
    1.0000   20.0000

3 个答案:

答案 0 :(得分:2)

除非我遗漏了某些内容,否则这似乎是非常过于复杂的方式:

P(P < -1) = -1;
P(P > 1) = 1;

或者,发烧友:

function mat = clamp(mat, minval, maxval)
mat(mat < minval) = minval;
mat(mat > maxval) = maxval;

答案 1 :(得分:1)

这是因为size(minimum)size(A2comp)不同。

看着

P(rows,:) = SomeVector;
min_range(rows,:)=-1;
max_range(rows,:)=1;

列数由右侧确定,因此min_rangemax_range仅由一列创建。

您可以将其矢量化:

function [ A2comp ] = MinMaxCheckMatrix( minimum, maximum, A2comp )
    A2comp = bsxfun(@max, A2comp, minimum);
    A2comp = bsxfun(@min, A2comp, maximum);
end

答案 2 :(得分:1)

我通常喜欢写这样的东西:

function [ mO ] = ClampArray( mO, minVal, maxVal )

mO = max(min(mO, maxVal), minVal);


end

现在您只需要P = ClampArray(P, -1, 1);