9

H0は配列 ( [1:10]) でH、単一の数値 ( 5) です。

H0すべての要素を単一の数値と比較する方法はH?

たとえば、

if H0>H 
   do something
else
   do another thing
end

MATLAB は常に別のことを行います。

4

3 に答える 3

9

ifスカラー true/false に評価するには、次のステートメントが必要です。ステートメントが配列の場合、動作はそれを でラップするのと同じall(..)です。

比較の結果が次のような論理配列になる場合

H0  = 1:10;
H   = 5;
test = H0>H;

-ステートメントを通過testするには、次の2 つのオプションがあります。if

(1) の出力を集約できます。たとえば、 の要素またはの要素が truetestの場合に if 節を実行したい場合などです。anyalltest

if any(test)
  do something
end

(2) の要素を反復処理し、testそれに応じて反応します。

for ii = 1:length(test)
   if test(ii)
      do something
   end
end

test論理ベクトルをインデックスとして使用することで、この操作をベクトル化できる場合があることに注意してください。

編集

コメントに示されているように、必要な場合、P(i)=H0(i)^3 if H0(i)<HそうP(i)=H0(i)^2でない場合は、単に書くだけです

 P = H0 .^ (H0<H + 2)
于 2012-12-03T13:07:10.720 に答える
2

@Jonas の最後の行での素晴らしい回答は、論理インデックスを使用したバージョンを思いつくきっかけになりました。

それ以外の

for i=1:N
  if H0(i)>H
     H0(i)=H0(i)^2;
  else
     H0(i)=H0(i)^3;
  end
end

あなたはこれを行うことができます

P = zeros(size(H0)); % preallocate output
test = H0>H;

P(test) = H0(test).^2; % element-wise operations 
                       % on the elements for which the test is true

P(~test) = H0(~test).^3; % element-wise operations 
                         % on the elements for which the test is false

これは一般的な解決策であることに注意してください。

于 2012-12-03T20:18:06.627 に答える
1

とにかくこれを見てみましょう:ismemeber()関数の使用。率直に言って、比較する方法がわかりません。メンバーとしてより大きい、小さい、等しい、または範囲内のいずれか。したがって、私の答えはまだ満足のいくものではないかもしれません。しかし、とにかくあなたにアイデアを与えるだけです。

H0 = [0 2 4 6 8 10 12 14 16 18 20];
H  = [10];
ismember(H,H0)
IF (ans = 1) then
// true
else
//false
end 

回答を更新

これは非常にブルートフォースな方法です- それを使って説明してください。私が提示したものよりも、ここで与えられた他の答えの方が良いでしょう. 理想的には、処理を使用して、より大きな/より低い値を2つの異なるベクトルに切り取ることが必要です^3-私は推測します... :)

H0 = [0 2 4 6 8 10 12 14 16 18 20];
H  = [10];

H0(:)
ans = 
     0
     2
     4
     6
     8
     10
     12
     14
     16
     18
     20

関数は、10 個を超えるfind値のすべての値のインデックスを線形インデックスで返します。H0

X = find(H0>H)
X = 
     7
     8
     9
     10
     11

関数は、線形インデックスで 10 未満findのすべての値のインデックスを返します。H0

Y = find(H0<H)
Y =
     1
     2
     3
     4
     5
     6

必要に応じて、 の各要素にアクセスしてH0大きい値/小さい値をチェックするか、上記の行列をインデックスと共に使用しH0て、算術演算で値を 2 つの異なる配列に切り取ることができます。

G = zeros(size(X)); // matrix with the size = number of values greater than H
J = zeros(size(Y)); // matrix with the size = number of values lower than H

for i = 1:numel(X)
     G(i) = H0(X(i)).^3
end

G(:)
ans =

      1728
      2744
      4096
      5832
      8000

for i = 1:numel(Y)
     J(i) = H0(Y(i)).^2
end

J(:)
ans =

      0
      4
     16
     36
     64
    100
于 2012-12-03T13:11:38.987 に答える