C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

多次元配列の順序を入れ替える /鬼太郎 (21/08/10(Tue) 23:24) #97945
Re[1]: 多次元配列の順序を入れ替える /WebSurfer (21/08/11(Wed) 10:09) #97946
│└ Re[2]: 多次元配列の順序を入れ替える /鬼太郎 (21/08/11(Wed) 11:09) #97948
(削除) / (21/09/17(Fri) 10:39) #98109
    ├ Re[3]: 多次元配列の順序を入れ替える /ニケ (21/08/11(Wed) 13:38) #97949
    └ Re[3]: 多次元配列の順序を入れ替える /WebSurfer (21/08/11(Wed) 13:53) #97950
      └ Re[4]: 多次元配列の順序を入れ替える /鬼太郎 (21/08/11(Wed) 19:17) #97951
        ├ Re[5]: 多次元配列の順序を入れ替える /WebSurfer (21/08/11(Wed) 19:48) #97952
        ├ Re[5]: 多次元配列の順序を入れ替える /Hongliang (21/08/11(Wed) 20:52) #97954
        ├ Re[5]: 多次元配列の順序を入れ替える /古谷 (21/08/11(Wed) 20:35) #97953
        └ Re[5]: 多次元配列の順序を入れ替える /WebSurfer (21/08/11(Wed) 21:14) #97955
          └ Re[6]: 多次元配列の順序を入れ替える /ニケ (21/08/13(Fri) 08:33) #97960


親記事 / ▼[ 97946 ] ▼[ 98109 ]
■97945 / 親階層)  多次元配列の順序を入れ替える
□投稿者/ 鬼太郎 (1回)-(2021/08/10(Tue) 23:24:43)

分類:[.NET 全般] 

多次元配列を使ったプログラムをVB.NETで書いています。

https://www.wareko.jp/blog/acceleration-loop-technique-of-multidimensional-array-in-csharp


このサイトにあるように


        Dim X_Max As Integer, Y_Max As Integer, Z_Max As Integer

        Dim Array(X_Max, Y_Max, Z_Max) As Single

        For z = 1 To Z_Max

            For y = 1 To Y_Max

                For x = 1 To X_Max

                    Dim aa = Array(x, y, z)

                Next x

            Next y

        Next z


とアクセスするよりも


        Dim Array2(Z_Max, Y_Max, X_Max) As Single

        For z = 1 To 100

            For y = 1 To 100

                For x = 1 To 100

                    Dim aa = Array2(z, y, x)

                Next x

            Next y

        Next z


とアクセスした方が5倍程度高速化できます。

ただ、画像ファイルの場合には、


Dim img As New Bitmap(X_Max, Y_Max, PixelFormat.Format8bppIndexed)


のようにX→Yの順番になっており、

Dim Array2(Z_Max, Y_Max, X_Max) As Single
で配列を宣言するのは
使いづらいです。


上記サイトによるとFortranの場合には、
多次元配列の格納順が逆になっており
Dim Array(X_Max, Y_Max, Z_Max) As Single
の方が高速になるそうなのですが、

VBの場合でもFortranと同じように
多次元配列で格納される順番を変えることってできないのでしょうか?


[ □ Tree ] 返信 編集キー/

▲[ 97945 ] / ▼[ 97948 ]
■97946 / 1階層)  Re[1]: 多次元配列の順序を入れ替える
□投稿者/ WebSurfer (2322回)-(2021/08/11(Wed) 10:09:19)
No97945 (鬼太郎 さん) に返信

> ただ、画像ファイルの場合には、
>
>
> Dim img As New Bitmap(X_Max, Y_Max, PixelFormat.Format8bppIndexed)
>
>
> のようにX→Yの順番になっており、
>
> Dim Array2(Z_Max, Y_Max, X_Max) As Single
> で配列を宣言するのは
> 使いづらいです。

Bitmap のコンストラクタとどういう関係があるのでしょう。話が分からないのですが? 
関係ないような気がします。
[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97946 ] / ▼[ 97949 ] ▼[ 97950 ]
■97948 / 2階層)  Re[2]: 多次元配列の順序を入れ替える
□投稿者/ 鬼太郎 (2回)-(2021/08/11(Wed) 11:09:53)
Bitmap のコンストラクタは 例として挙げたまでで特に深い意味はありません。

見た目的に
Z Y X
と並んでいたよりも
X Y Z
と並んでいた方がコードが見やすいので

2次元配列のメモリー内での格納順を変えられるのなら
その方法が知りたいのですが。
そのような方法はございませんでしょうか?


[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97945 ] / 返信無し
■98109 / 1階層)  (削除)
□投稿者/ -(2021/09/17(Fri) 10:39:22)
この記事は(管理者)削除されました
[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97948 ] / 返信無し
■97949 / 3階層)  Re[3]: 多次元配列の順序を入れ替える
□投稿者/ ニケ (23回)-(2021/08/11(Wed) 13:38:30)
No97948 (鬼太郎 さん) に返信
> Bitmap のコンストラクタは 例として挙げたまでで特に深い意味はありません。
>
> 見た目的に
> Z Y X
> と並んでいたよりも
> X Y Z
> と並んでいた方がコードが見やすいので

変数名だけの問題にしか思えないんだけど?
ループの入れ子も含めて全ての変数名のzとxを入れ替えただけでは何がまずいの?

[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97948 ] / ▼[ 97951 ]
■97950 / 3階層)  Re[3]: 多次元配列の順序を入れ替える
□投稿者/ WebSurfer (2323回)-(2021/08/11(Wed) 13:53:41)
No97948 (鬼太郎 さん) に返信

> 見た目的に
> Z Y X
> と並んでいたよりも
> X Y Z
> と並んでいた方がコードが見やすいので
> 
> 2次元配列のメモリー内での格納順を変えられるのなら
> その方法が知りたいのですが。
> そのような方法はございませんでしょうか?

新たに順序を変えて作り直す以外に方法はないと思います・・・が、そもそもそんな
ことをする必要は 100% あり得ないと思いますけど。単純に配列にアクセスして操作
する順番を変えれば済む話です。

以下のコードで試してみましたが、

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[,,] cube = {
                {  { 0,  1,  2},  { 3,  4,  5}, { 6,  7,  8} },
                {  { 9, 10, 11},  {12, 13, 14}, {15, 16, 17} },
                {  {18, 19, 20},  {21, 22, 23}, {24, 25, 26} }
            };

            for (int i = 0; i < cube.GetLength(0); i++)
            {
                for (int j = 0; j < cube.GetLength(1); j++)
                {
                    for (int k = 0; k < cube.GetLength(2); k++)
                    {
                        Console.Write($"{cube[i,j,k]} ");
                    }
                }
            }

            Console.WriteLine("\n-----------");

            foreach (byte i in cube)
            {
                Console.Write($"{i} ");
            }
        }
    }
}

C# の多元配列のメモリ上で各要素の配置は上のコードの 1, 2, 3 ... 26 の順番になる
ようです。

以下の画像を見てください。(Visual Studio のデバッグ画面にスクリーンショットです。
クリックすると表示されます)

http://surferonwww.info/BlogEngine/image.axd?picture=2021%2f8%2f0811array.jpg

なので、上のコードの for ループ、foreach ループの順序でアクセスすれば、メモリに
並んでいる順序でアクセスできるはずです。ちなみに、実行結果は:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
-----------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97950 ] / ▼[ 97952 ] ▼[ 97954 ] ▼[ 97953 ] ▼[ 97955 ]
■97951 / 4階層)  Re[4]: 多次元配列の順序を入れ替える
□投稿者/ 鬼太郎 (3回)-(2021/08/11(Wed) 19:17:49)
            byte[,,] cube = {
                {  { 0, 3, 6},  { 9,  1, 15}, {18, 21, 24} },
                {  { 1, 4, 7},  {10, 13, 16}, {19, 22, 25} },
                {  { 2, 5, 8},  {11, 14, 17}, {20, 23, 26} }
            };

この配列で同じコードを実行した時に、
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26


となるように設定を変えたいという質問なのですが
そういう設定はないということでしょうか?

> ループの入れ子も含めて全ての変数名のzとxを入れ替えただけでは何がまずいの?

これまで作ってきた全てのプログラムを書き換える必要があり
非常に面倒なので質問させていただいております。


[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97951 ] / 返信無し
■97952 / 5階層)  Re[5]: 多次元配列の順序を入れ替える
□投稿者/ WebSurfer (2324回)-(2021/08/11(Wed) 19:48:44)
No97951 (鬼太郎 さん) に返信
> byte[,,] cube = {
> { { 0, 3, 6}, { 9, 1, 15}, {18, 21, 24} },
> { { 1, 4, 7}, {10, 13, 16}, {19, 22, 25} },
> { { 2, 5, 8}, {11, 14, 17}, {20, 23, 26} }
> };
>
> この配列で同じコードを実行した時に、
> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

何を言っているのか分かりません。話が通じません。何も分かってないのでは?

ここに書いてあること以外は知り得ない第三者が読んで、100% 誤解なく理解できるよう、
あなたのやりたいことを正確に文書化してください。

[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97951 ] / 返信無し
■97954 / 5階層)  Re[5]: 多次元配列の順序を入れ替える
□投稿者/ Hongliang (1188回)-(2021/08/11(Wed) 20:52:55)
> そういう設定はないということでしょうか?
はい、ないです。
// でも私が試した限り5倍なんて差は出ないなぁ。せいぜい数%かな。
[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97951 ] / 返信無し
■97953 / 5階層)  Re[5]: 多次元配列の順序を入れ替える
□投稿者/ 古谷 (6回)-(2021/08/11(Wed) 20:35:19)
No97951 (鬼太郎 さん) に返信
> byte[,,] cube = {
> { { 0, 3, 6}, { 9, 1, 15}, {18, 21, 24} },
> { { 1, 4, 7}, {10, 13, 16}, {19, 22, 25} },
> { { 2, 5, 8}, {11, 14, 17}, {20, 23, 26} }
> };
>
> この配列で同じコードを実行した時に、
> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
>
>
> となるように設定を変えたいという質問なのですが
> そういう設定はないということでしょうか?

設定ではむりぽなので↓みたいなメソッドを作るとかかなー

static void set(byte[] a, int x, int y, int z) {
 ほにゃほにゃ
}

使いづらいことに慣れるっていうのが一番かもわからんけど

[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97951 ] / ▼[ 97960 ]
■97955 / 5階層)  Re[5]: 多次元配列の順序を入れ替える
□投稿者/ WebSurfer (2325回)-(2021/08/11(Wed) 21:14:18)
ここに限った話ではないけど、どうして最近こういう訳の分からない質問が多いのだろう・・・

ゆとり教育の成果? それとも自分の理解力の不足? もしくは自分が時代についていけ
てないだけ?


[ 親 97945 / □ Tree ] 返信 編集キー/

▲[ 97955 ] / 返信無し
■97960 / 6階層)  Re[6]: 多次元配列の順序を入れ替える
□投稿者/ ニケ (24回)-(2021/08/13(Fri) 08:33:29)
基本構文を組み上げてプログラムを作るのが常識だった時代と
既存のメソッドが豊富な時代のギャップかなぁ。。。
質問内容を見たまず第一の感想が「なんでそんなことする必要があるの?」
になっちゃうけど、あるなしだったらないんだから「ない」だけで
それ以上関わらないのがお互い幸せなんだろうね。

>> ループの入れ子も含めて全ての変数名のzとxを入れ替えただけでは何がまずいの?
>
>これまで作ってきた全てのプログラムを書き換える必要があり
>非常に面倒なので質問させていただいております。
変数名を分かり易くとか冗長なコードを書かない、メンテしやすい意識で作ってきて
いれば、全てのプログラムを書き換えること自体大したことではありません。

[ 親 97945 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -