问题:我需要在[-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
答案 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_range
和max_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);
。