1

ex [1 2 3] のベクトルを取得し、1 = [1 1]、2 = [4 6 8]、3 = [6 9 12 15 ] (実際の問題の短い例) したがって、私の関数は理想的には次のようになります。 convert([1 2 3]) = [1 1 4 6 8 6 9 12 15]

私の思考プロセスは、最初にベクトルをセル配列にして、値を異なる次元の他の値に置き換えてから、セル配列をベクトル/行列に戻す必要があるということです。これは私がこれまでに持っているものです

y = num2cell(x);

for n = 1:length(x)
    if y{n} == 0
        y{n} = [0 2];
    elseif y{n} == 1
        y{n}= [1 1];
    elseif y{n} == 2
        y{n} = [4 6 8];
    elseif y{n} == 3
        y{n} = [6 9 12 15];

    elseif y{n} < 0
        y{n} = 1 - convert(-(x+1));
    end
    output = cell2mat(y);
end
end

入力の初期ベクトルに 0、1、2、または 3 の正の値がある場合、すべて正常に動作します。ただし、ベクトルに負のエントリ (x) がある場合、負のエントリが次のように入力されるという条件が必要ですが、y{n} = 1 - convert(-(x+1))これを行うと、再帰的な制限に達するというエラーが発生します。負の値で動作し、エラーが発生しないようにコードを修正する方法はありますか? また、for または while ループを使用せずにそれを行う方法はありますか? ありがとう

4

1 に答える 1

0

セルはまったく必要ありませんが、質問に答えるには、ループする前にネガティブに対処して、不要な再帰を回避することをお勧めします。したがって、コードに正しく従っていると仮定すると、これに沿った何かがあります。

negs = x < 0;
x(negs) = -(x(negs) + 1)

y = num2cell(x);

for n = 1:length(x)
    if y{n} == 0
        y{n} = [0 2];
    elseif y{n} == 1
        y{n}= [1 1];
    elseif y{n} == 2
        y{n} = [4 6 8];
    elseif y{n} == 3
        y{n} = [6 9 12 15];
    end

    if negs(n)
        y{n} = 1 - x;
    end
    output = cell2mat(y);
    end
end

y{n} = 1 - x;ところで、私はこの行が実際にあるべきだと感じていますy{n} = 1 - x(n); (つまり、元のコードは次のようになっているはずです)y{n} = 1 - convert(-(x(n)+1));

于 2013-03-12T09:19:17.407 に答える