1

私はMatlabの初心者であり、Excelで簡単に実行できる簡単なタスクの実行方法に困惑しています。マトリックス内のセル間の変化率を取得しようとしているだけです。このタスクのforループを作成したいと思います。データは次の形式で設定されます。

                DAY1 DAY2 DAY3...DAY 100

被験者の結果

2つのデータポイント間の変化率の取得しか実行できませんでした。複数の日と複数の科目にまたがる場合、どのように実施しますか?そして説明をお願いします

本当にありがとう

たとえば、1日目のSUBJECT1(RESULT = 1)、SUBJECT2(RESULT = 4)、SUBJECT3(RESULT = 5)、2日目のSUBJECT1(RESULT = 2)、SUBJECT2(RESULT = 8)、SUBJECT3(RESULT = 10)、 3日目SUBJECT1(RESULT = 1)、SUBJECT2(RESULT = 4)、SUBJECT3(RESULT = 5)。パーセントの変更が必要なので、出力は2日目のSUBJECT1(RESULT = 100%)、SUBJECT2(RESULT = 100%)、SUBJECT3(RESULT = 100%)になります。DAY3 SUBJECT1(RESULT = 50%)、SUBJECT2(RESULT = 50%)、SUBJECT3(RESULT = 50%)

更新しました:

こんにちは、みんなに答えてくれてありがとう。混乱させて申し訳ありません。zebediah49は私が探しているものにかなり近いです。私のデータは、たとえば10x10のdoubleです。列ごとの変化率を取得したかっただけです。たとえば、すべての列(列2:10から)の行1から10へのパーセンテージの変更が必要な場合。コードを任意の行列次元(たとえば、1000 x 1000ダブル)で機能させたいです。zebediah49投稿したコードについて説明していただけますか?ありがとう

update2:zebediah49、

(data(1:end、100)-data(1:end、99))./ data(1:end、99)

output = [data(:、2:end)-data(:、1:end-1)] ./ data(:、1:end-1)* 100;

上記のコードを観察して、列100が他のすべての列(1-99)に対するインデックスとして使用されるように、どのように変更しますか?コードを次のように変更した場合:

(data(1:end、100)-data(1:end、:))./ data(1:end、:)

行列の次元を超えているため、matlabはできません。どうすればそれを実装できますか?

更新3

zebediah49、

完璧に動作しました!!! もともと私はインデックスの新しい変数を作成し、行列に一致するようにインデックスをrepmatしましたが、これは良い考えではありませんでした。多数を処理する場合、複製するのに永遠に時間がかかりました。もう一度貢献していただきありがとうございます。

クリスもあなたの貢献に感謝します!!! マトリックス内の配列をアドレス指定して操作する方法についてもっと調べていました。

4

2 に答える 2

4

それはmatlabです。実際にはループは必要ありません。

output=input(2:end,:)./input(1:end-1,:)*100;

おそらくあなたが望むことを大まかに行うでしょう。matlabの構造については何も指定していないため、機能させるにはインデックスの順序などを変更する必要がある場合があります。

明らかでない場合、その行は、出力を、右に1つの要素だけシフトされた入力行列で割った入力行列で構成される行列として定義します。演算子は重要です。./これは、行列の除算ではなく、各要素を対応する要素で除算することを意味するためです。

編集:さらなる説明が要求されました:私はあなたがフォームの%変更をしたいと思ったと思いまし1->1->2->3->1100%, 200%, 150%, 33%。もう1つの形式は、を減算することで取得できます100%

input(2:end,:)最初の行が切り取られているサブマトリックスを取得します。(時間を最初の次元に沿って配置します...逆の方法が必要な場合input(:,2:end)。Matlabは1インデックスでありend、las要素を参照するために特別な値を使用できます。したがって、end-1は最後から2番目です。ここでのポイントは、この行列の要素(i)が元の要素(i + 1)であるということです。

input(1:end-1,:)、上記のように、最後の列が欠落していることを除いて、サブマトリックスも取得します。

次に、要素(i)を要素(i + 1)で除算します。私がサブマトリックスを選んだ方法のために、それらは今並んでいます。

半グラフィカルなデモンストレーションとして、上記の番号を使用します。

input:          [1 1 2 3 1]
input(2,end):     [1 2 3 1]
input(1,end-1): [1 1 2 3]

分割するときは、1回目/ 1回目、2回目/2回目などです。

input(2:end,:)./input(1:end-1,:):
   [1   2   3   1  ]
./ [1   1   2   3  ]
---------------------
== [1.0 2.0 1.5 0.3]

(:)に設定された追加のインデックスは、他のすべてのディメンションでその手順を実行することを意味します。

EDIT2:改訂された質問:行を除外し、それをインデックスとして保持するにはどうすればよいですか。あなたはあなたがの効果のために何かを試みたと言います(data(1:end,100)- data(1:end,:))./data(1:end,:)。要素ごとの演算子は同じサイズである必要があるため、Matlabはこれを好みません。100番目の列でのみ機能するようにしたい場合は、2番目のインデックスを100ではなくに設定:します。代わりに、最初をインデックスに設定し、残りをデータに設定することをお勧めします。したがって、データは最初のデータを切り落とすことによって処理されます。

output=[data(2:end,2:end)-data(2:end,1:end-1)]./data(2:end,1:end-1)*100;

または、(開始を無視すると、matlabは1;を想定します。終了を無視すると、を想定しend、の(:)省略形になり(1:end)ます。

output=[data(2:,2:end)-data(2:,1:end-1)]./data(2:,1:end-1)*100;

ただし、おそらくインデックスを元に戻す必要があります。その場合は、そのサブ配列を追加する必要があります。

output=[data(1,1:end-1) data(2:,2:end)-data(2:,1:end-1)]./data(2:,1:end-1)*100];

ただし、これはおそらくあなたがそれを行うべき方法ではありません-データを1つのマトリックスに保持し、時間またはその他のものを別の配列に保持します。これにより、時間を除外することを心配することなく、データに対してこのようなことを行うのがはるかに簡単になります。グラフを作成するときに特に便利です。

ああ、そしてもう1つ:

(data(:,2:end)-data(:,1:end-1))./data(:,1:end-1)*100;

と同じように同等です

data(:,2:end)./data(:,1:end-1)*100-100;
于 2012-05-24T06:31:59.747 に答える
2

zebediah49が上記のコメントで正しく推測され、

1  4  5
2  8 10
1  4  5

に変わる

   1    1    1
 -.5  -.5  -.5

次に、これを試してください:

data = [1,4,5; 2,8,10; 1,4,5];
changes_absolute = diff(data);
changes_absolute./data(1:end-1,:)

ans =

    1.0000    1.0000    1.0000
   -0.5000   -0.5000   -0.5000

中間変数は必要ありません。直接書き込むことができますdiff(data)./data(1:end,:)。上記の方が読みやすいのではないかと思いました。その結果からパーセンテージの数値に到達することは、読者の練習問題として残されています。:-)

ああ、本当に-50%ではなく50%が必要な場合はabs、最終行のあたりで使用してください。

于 2012-05-24T07:19:27.263 に答える