三次元(XYZ)を1つの関数に置く

조회 수: 11 (최근 30일)
皓
2023년 7월 7일
댓글: 2023년 8월 2일
図1
図2
図1の縦方向をY軸、横方向をX軸とし、CXVファイルをZ軸方向としています。
この(XYZ)を使ってA=(XYZ)のような1つの関数に置きたいです。
宜しくお願いします。

채택된 답변

交感神経優位なあかべぇ
下記にサンプルコードを作成しました。全てのCSVファイルのX,Yのそれぞれのデータ数は全部等しいことを前提にしています。
% サンプルとなるCSVファイルを作成
fileName = 'file_';
for i = 1 : 10
data = zeros(11,11);
data(1,2:end) = 0:9;
data(2:end,1) = 0:9;
data(2:end, 2:end) = reshape(1:100, 10, 10); % サンプルデータはとりあえず連番データを挿入
fileData = num2cell(data);
fileData{1,1} = 'y/x';
writecell(fileData, [fileName, num2str(i-1), '.CSV']);
end
fileData % CSVに保存したデータのひとつを表示
fileData = 11×11 cell array
{'y/x'} {[ 0]} {[ 1]} {[ 2]} {[ 3]} {[ 4]} {[ 5]} {[ 6]} {[ 7]} {[ 8]} {[ 9]} {[ 0]} {[ 1]} {[11]} {[21]} {[31]} {[41]} {[51]} {[61]} {[71]} {[81]} {[ 91]} {[ 1]} {[ 2]} {[12]} {[22]} {[32]} {[42]} {[52]} {[62]} {[72]} {[82]} {[ 92]} {[ 2]} {[ 3]} {[13]} {[23]} {[33]} {[43]} {[53]} {[63]} {[73]} {[83]} {[ 93]} {[ 3]} {[ 4]} {[14]} {[24]} {[34]} {[44]} {[54]} {[64]} {[74]} {[84]} {[ 94]} {[ 4]} {[ 5]} {[15]} {[25]} {[35]} {[45]} {[55]} {[65]} {[75]} {[85]} {[ 95]} {[ 5]} {[ 6]} {[16]} {[26]} {[36]} {[46]} {[56]} {[66]} {[76]} {[86]} {[ 96]} {[ 6]} {[ 7]} {[17]} {[27]} {[37]} {[47]} {[57]} {[67]} {[77]} {[87]} {[ 97]} {[ 7]} {[ 8]} {[18]} {[28]} {[38]} {[48]} {[58]} {[68]} {[78]} {[88]} {[ 98]} {[ 8]} {[ 9]} {[19]} {[29]} {[39]} {[49]} {[59]} {[69]} {[79]} {[89]} {[ 99]} {[ 9]} {[10]} {[20]} {[30]} {[40]} {[50]} {[60]} {[70]} {[80]} {[90]} {[100]}
list = dir('*.CSV'); % CSVファイルの取り出し
filePath = fullfile(list(1).folder, list(1).name); % 一つ目のCSVファイルパスを取得
file1Data = readmatrix(filePath, 'Range', [2,2]); % データを示すセル(2行2列目)からデータの読み込み
csvData = zeros([size(file1Data), length(list)]); % データの初期化
csvData(:,:,1) = file1Data; % ひとつめのファイルのデータを挿入
for i = 2 : length(list) % 2ファイル目以降のファイル読み込みのためのループ文
filePath = fullfile(list(i).folder, list(i).name);
csvData(:,:,i) = readmatrix(filePath, 'Range', [2,2]); % CSVファイルのデータの代入
end
csvData(:,:,1) % 一つ目のファイルのデータを表示
ans = 10×10
1 11 21 31 41 51 61 71 81 91 2 12 22 32 42 52 62 72 82 92 3 13 23 33 43 53 63 73 83 93 4 14 24 34 44 54 64 74 84 94 5 15 25 35 45 55 65 75 85 95 6 16 26 36 46 56 66 76 86 96 7 17 27 37 47 57 67 77 87 97 8 18 28 38 48 58 68 78 88 98 9 19 29 39 49 59 69 79 89 99 10 20 30 40 50 60 70 80 90 100
  댓글 수: 9
交感神経優位なあかべぇ
편집: 交感神経優位なあかべぇ 2023년 7월 28일
④ '^file_(\d+)\.'は正規表現です。^は文字列の先頭を指し、\dは数字、\d+は一つ以上連続した数値の文字列、\.は、.を指します。(正規表現で.は任意の文字を表すので、文字の.を表現するには\.になります。)
また、(\d+)の()はトークンを表します。
'once'は一回の一致のみの検索を表します。
'tokens'は正規表現で指定したトークンの文字列の抽出の指定になり、今回のトークンの対象は(\d+)の部分です。これにより、連続の数字の文字列(\d+)を抽出することができます。
sortの第2出力はソート結果の並べ替えインデックスを指します。
a = [3,2,1,5,4];
[data, sortIdx] = sort(a) % 出力1は昇順に並び替えたデータで、出力2はソート結果の並び替えインデックス
data = 1×5
1 2 3 4 5
sortIdx = 1×5
3 2 1 5 4
また、配列データのインデックスに並び替えたい数値配列を指定すると、その配列順にデータを並び替えることができます。
orderIdx = [3,2,1];
data = [1,2,3];
orderData = data(orderIdx)% orderIdxで指定した順序に並び替え
orderData = 1×3
3 2 1
この2つを組み合わせると、sortで指定した並び替え順序を他のデータに反映させることができます。
data = [3,2;1,2;2,7;6,8;5,11;4,100]%1列目の数値が昇順になるように行全体を並べ替えたい。
data = 6×2
3 2 1 2 2 7 6 8 5 11 4 100
[~, sortIdx] = sort(data(:,1));% 1列目の数値配列のソート結果のインデックス取得
sortData = data(sortIdx,:) %ソート結果のインデックスをもとに行の並び替え
sortData = 6×2
1 2 2 7 3 2 4 100 5 11 6 8
⑥ カラーのラベルについて、climでカラーの上下限値を設定できるので、全てのグラフでclim([0,100])を指定すれば、全て0~100の幅を持ったカラーバーに統一できます。(MATLAB R2022aより前のバージョンの場合はcaxisです。)
また、カラーの色の指定はcolormapでできます。カラーの色は標準でいくつか用意されています。(色を自作することも可)
サンプルを下記に書きました。
sample1 = peaks(0:9) .* 10; % サンプルデータ1の作成
[min(sample1(:)), max(sample1(:))] % data1の上下限の確認
ans = 1×2
0.0000 58.5913
sample2 = sample1 .* 2;% サンプルデータ2の作成。サンプル1より2倍大きい
colormap(turbo()); % カラーマップの色の指定 理想形に近そうな色を選択
contourf(0:9,0:9,sample1); % sample1のコンター図描画
clim([0,100]); % カラーマップの上下限値の指定
colorbar; % カラーバー表示
contourf(0:9,0:9,sample2);% sample2のコンター図描画
clim([0,100]);% カラーマップの上下限値の指定
colorbar;% カラーバー表示
皓
2023년 8월 2일
コンター図を描くことができました。
追加で何度も何度も質問に答えてくださり、ありがとうございました。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 構造体에 대해 자세히 알아보기

제품


릴리스

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!