第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

找出兩個(gè) 1d 數(shù)組之間的差異,以在最短的時(shí)間內(nèi)形成這些差異的 2d 數(shù)組

找出兩個(gè) 1d 數(shù)組之間的差異,以在最短的時(shí)間內(nèi)形成這些差異的 2d 數(shù)組

C#
犯罪嫌疑人X 2022-07-23 17:27:52
我試圖找到一個(gè)數(shù)組的每個(gè)元素與另一個(gè)數(shù)組的每個(gè)元素之間的絕對(duì)差異以形成一個(gè)矩陣。我已經(jīng)使用 for 循環(huán)實(shí)現(xiàn)了這一點(diǎn),但它很慢,我需要它更快。例如,我可以通過使用 dist 方法在 R 中更快地做到這一點(diǎn),但我正在努力在 C# 中讓它變得更快。double[] array1 = new double [] { 1.1, 2.0, 3.0, 4.0, 5.0 };double[] array2 = new double[] { 6.1, 7.0, 8.0};    double[,] final_array = new double[5, 3];for (int i = 0; i < 5; i++){    for (j = 0; j < 3; j++)    {        final_array[i,j] = Math.Abs(array1[i] - array2[j])    }}# expected result of final_array5    4.1    3.1     2.1     1.15.9  5      4       3       26.9  6      5       4       3雖然這個(gè)結(jié)果是正確的答案,但我想更快地做到這一點(diǎn),因?yàn)槲倚枰獙?duì)最大為 15,000 的數(shù)組進(jìn)行此計(jì)算。
查看完整描述

2 回答

?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

您可以在命名空間中使用向量System.Numerics。需要注意的是,它只適用于float,而不適用于double。不過,這不應(yīng)該是減法的問題:


float[] array1 = new float[] { 1.1F, 2.0F, 3.0F, 4.0F, 5.0F };

float[] array2 = new float[] { 6.1F, 7.0F, 8.0F };    

float[,] final_array = new float[array1.Length, array2.Length];


int vectorCount = array2.Length / 4;

Vector4[] array2Vectors = new Vector4[vectorCount];

Parallel.For(0, vectorCount, i =>

{

    int offset = i * 4;

    array2Vectors[i] = new Vector4(array2[offset], array2[offset + 1],

        array2[offset + 2], array2[offset + 3]);

});


Parallel.For(0, array1.Length, i =>

{

    Vector4 v1 = new Vector4(array1[i], array1[i], array1[i], array1[i]);

    for (int j = 0; j < array2Vectors.Length; j++)

    {

        Vector4 result = Vector4.Abs(Vector4.Subtract(v1, array2Vectors[j]));

        int offset = j * 4;

        final_array[i, offset] = result.X;

        final_array[i, offset + 1] = result.Y;

        final_array[i, offset + 2] = result.Z;

        final_array[i, offset + 3] = result.W;

    }


    for (int j = vectorCount * 4; j < array2.Length; j++)

    {

        final_array[i,j] = Math.Abs(array1[i] - array2[j]);

    }

});

由于您現(xiàn)在使用向量,因此您將使用 CPU 的 SIMD 指令,這將加快您的任務(wù)。


額外的性能提升來自Parallel.For使用所有可用 CPU 內(nèi)核的并行執(zhí)行。


查看完整回答
反對(duì) 回復(fù) 2022-07-23
?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

就算法復(fù)雜性而言,沒有辦法更快地做到這一點(diǎn)。它需要精確O(n * m)的操作來計(jì)算這個(gè)結(jié)果,至少因?yàn)槟阌心莻€(gè)大小的結(jié)果數(shù)組。


有一些方法可以稍微提高代碼本身的性能。

正如評(píng)論中已經(jīng)建議的那樣,最簡(jiǎn)單的一種是切換到鋸齒狀數(shù)組:


double[] array1 = new double [] { 1.1, 2.0, 3.0, 4.0, 5.0 };

double[] array2 = new double[] { 6.1, 7.0, 8.0};    

double[][] final_array = new double[5][];


for (int i = 0; i < 5; i++)

{

    final_array[i] = new double[3];

    for (int j = 0; j < 3; j++)

    {

        final_array[i][j] = Math.Abs(array1[i] - array2[j]);

    }

}

您可以在此處閱讀有關(guān)多維數(shù)組與交錯(cuò)數(shù)組及其性能的更多信息:

C# 中多維數(shù)組和數(shù)組數(shù)組之間的區(qū)別是什么?


您還可以通過使用不安全指針訪問多維數(shù)組或利用高級(jí)處理器指令(內(nèi)在函數(shù))進(jìn)一步提高性能,但是......問題是:這真的是您需要考慮的事情嗎?它是極高負(fù)載系統(tǒng)中唯一的瓶頸嗎?如果不是,那么只需將您的代碼保持原樣,以清晰易讀和易于理解的形式。說到性能,O(n * m)漸近復(fù)雜度對(duì)于大小為 15000 的數(shù)組來說非常好。


查看完整回答
反對(duì) 回復(fù) 2022-07-23
  • 2 回答
  • 0 關(guān)注
  • 132 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)