常見程式演算:: 多維矩陣降維 - OpenHome.cc

文章推薦指數: 80 %
投票人數:10人

更高維度的可以自行類推,不過更高維度時,建議使用其他資料結構,比較具體也不易搞錯。

程式實作. C Java Python Scala OPENHOME.CC 常見程式演算 |老掉牙 河內塔 費式數列 巴斯卡三角形 三色旗 老鼠走迷宮 騎士走棋盤 八皇后 八銀幣 康威生命遊戲 字串比對 背包問題 雙色、三色河內塔 得分排行 |「數」 最大訪客數 Eratosthenes篩選求質數 完美數 阿姆斯壯數 大數運算 指定位數的圓周率 |隨機 蒙地卡羅法求PI 洗牌 Craps賭博遊戲 約瑟夫問題 |組構 排列 格雷碼 子集 k組合 因數分解 加法因子 |排序 選擇、插入、氣泡排序 Heap排序-改良的選擇排序 Shell排序-改良的插入排序 Shaker排序-改良的氣泡排序 快速排序(一) 快速排序(二) 合併排序 基數排序 |搜尋 線性搜尋 二分搜尋 插補搜尋 費氏搜尋 |矩陣 稀疏矩陣 多維矩陣降維 上/下三角、對稱矩陣 奇數魔方陣 4N魔方陣 2(2N+1)魔方陣 |運算 中序式轉後序式 後序式運算 Quine GitHub Twitter Facebook LinkedIn Designs Tags BuiltwithbyHugo HOME> 常見程式演算> 矩陣> 多維矩陣降維 解法思路 程式實作 dimensionreduction matrix C Java Python Scala Ruby JavaScript Haskell 多維矩陣降維 December12,2021 有時為了運算方便或儲存時空間問題,會將多維矩陣降維,例如,是將多面體的頂點攤平,並結合頂點索引來定義多面體,或者將上三角、下三角或對角矩陣降一維陣列,以節省空間, 解法思路 以二維陣列轉一維陣列為例,索引由0開始,看要以列為主(row-major)或以行為主(column-major)。

以列為主的二維陣列要降為一維時,是將二維陣列由上往下,逐列寫入一維陣列,此時索引的對應公式如下,其中row與column是二維陣列索引,loc表示對應的一維陣列索引: loc=column+row*行數 以行為主的二維陣列要降為一維時,是將二維陣列由左往右,逐行寫入一維陣列,此時索引的對應公式如下: loc=row+column*列數 若是三維陣列,公式如下,其中i(個數u1)、j(個數u2)、k(個數u3)分別表示三維陣列的三個索引: 以列為主:loc=i*u2*u3+j*u3+k 以行為主:loc=k*u1*u2+j*u1+i 更高維度的可以自行類推,不過更高維度時,建議使用其他資料結構,比較具體也不易搞錯。

程式實作 C Java Python Scala Ruby JavaScript Haskell #include #include #defineROW3 #defineCOLUMN4 voidtoOneByRow(int[][],int[]); voidtoOneByColumn(int[][],int[]); intindexByRow(int,int); intindexByColumn(int,int); voidtoOne(int[][COLUMN],int[],int(*)(int,int)); intmain(void){ intarr1[ROW][COLUMN]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; intarr2[ROW*COLUMN]={0}; printf("原二維資料:\n"); introw,column; for(row=0;row<3;row++){ for(column=0;column<4;column++){ printf("%4d",arr1[row][column]); } printf("\n"); } printf("\n以列為主:"); toOneByRow(arr1,arr2); inti; for(i=0;i<12;i++) printf("%d",arr2[i]); printf("\n以行為主:"); toOneByColumn(arr1,arr2); for(i=0;i<12;i++) printf("%d",arr2[i]); printf("\n"); return0; } voidtoOneByRow(intarr1[][COLUMN],intarr2[]){ toOne(arr1,arr2,indexByRow); } voidtoOneByColumn(intarr1[][COLUMN],intarr2[]){ toOne(arr1,arr2,indexByColumn); } intindexByRow(introw,intcolumn){ returncolumn+row*COLUMN; } intindexByColumn(introw,intcolumn){ returnrow+column*ROW; } voidtoOne(intarr1[][COLUMN],intarr2[],int(*index)(int,int)){ introw,column; for(row=0;rowInt)={ valarr=newArray[Int](array.length*array(0).length) for(rowcolumn+row*array[0].length); } functiontoOneByColumn(array){ returntoOne(array,(row,column)=>row+column*array.length); } functiontoOne(array,f){ arr=[] for(letrow=0;row



請為這篇文章評分?