2011-09-19 79 views
1

我需要Matlab的find函數(reference)的下陣列的等效:等效Matlab在發現功能

IND =找到(X)位於陣列X的所有非零元素,並且返回向量ind中的那些元素的線性索引 。如果X是行向量,則 則ind是行向量;否則,ind是一個列向量。如果X 不包含非零元素或爲空數組,然後IND是一個 空數組。

甲瑣碎未經測試的例子:

#include <stdlib.h> 
#include <time.h> 
int main() 
{ 
    /* Initialize variables */ 
    int x[25]; 
    int y[25]; 

    /* initialize random seed: */ 
    srand (time(NULL)); 

    /* Fill arrays with stuff */ 
    for (i=0;i<25;i++) 
    { 
     x[i] = rand(); 
     y[i] = rand(); 
    } 

    /* Find */ 
    ind = find((x-y) > 0); // Need to figure out how to do this 
    } 
} 

現在踢球者是我不能使用升壓或C++容器,如vector由於項目約束。

+4

我的猜測是你必須推出自己的。 – Dima

+0

@Dima,那是我最初的猜測和希望堆棧Exchange可以證明我錯了。 – Elpezmuerto

+0

@Dorgan,這就是爲什麼它的瑣碎和我所得到快速編碼的東西了對飛未經測試:對 – Elpezmuerto

回答

1

如果僅限於「香草C」(這似乎是這樣的,從你的問題)沒有什麼像內置的,你必須寫自己的這種功能的版本。

但是,從我從你的例子看,你需要比find功能不同的東西,你想找到不同的進xy的元素。如果你爭取靈活性,編寫一個通用函數來檢查兩個數組上的給定謂詞(作爲函數指針傳遞)可能是一個好主意。另一方面,因爲在C中我們只有函數指針(而不是函子),性能可能會受到影響。

+0

雅的追求,在香草下,在這種情況下工作很爛 – Elpezmuerto

1

這應該做一些接近你想要的東西 - 返回非零元素,它已經擺在outArray你的號碼。不太一樣的呼叫簽名,但應該做你想做的。未經測試:)

size_t find(int *inArray, int *outArray, size_t arraySize) 
{ 
    size_t numElements = 0; 
    for(int i=0; i<arraySize; i++) 
    { 
    if(inArray[i]) 
    { 
     outArray[numElements++] = inArray[i]; 
    } 
    } 

    return numElements; 
} 
+0

我會使用'size_t'爲'arraySize', 'numElements'和'find'的返回類型。 –

+0

有道理 - 將編輯。 –

+0

@MichaelDorgan:如果我們想爲'outArray'預分配的空間,最壞的情況表明使用大如原來'inArray'的數組。我們如何在沒有對輸入數組進行雙重傳遞的情況下節省空間? – Amro