From 25995ac6b7e60c9d6d012a2d3c6c3d2859e33623 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Sat, 29 Jan 2022 21:31:44 +0000 Subject: =?UTF-8?q?Implement=20pick=20=E2=8A=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'functions.c') diff --git a/functions.c b/functions.c index b72c2bd..1645e77 100644 --- a/functions.c +++ b/functions.c @@ -95,7 +95,7 @@ fndyad dyadfunctiondefs[] = { fnTake, /* ↑ */ 0, /* ↓ */ 0, /* ⊂ */ - 0, /* ⊃ */ + fnPick, /* ⊃ */ 0, /* ⊆ */ fnIndex, /* ⌷ */ 0, /* ⍋ */ @@ -1151,6 +1151,36 @@ fnTake(Array *left, Array *right) return result; } +Array * +fnPick(Array *left, Array *right) +{ + if(left->rank > 1) + throwerror(nil, ERank); + if(left->size == 0) + return fnSame(right); + + int io = globalIO(); + Array *result = fnSame(right); + for(int i = 0; i < left->size; i++){ + Array *ix = arrayitem(left, i); + if(ix->rank > 1) + throwerror(nil, ERank); + if(ix->size != result->rank) + throwerror(nil, ERank); + int index = 0; + for(int j = 0; j < ix->size; j++){ + int add = ix->intdata[j] - io; + for(int k = j+1; k < ix->size; k++) + add *= result->shape[k]; + index += add; + } + Array *tmp = result; + result = arrayitem(result, index); + freearray(tmp); + } + return result; +} + Array * fnIndex(Array *left, Array *right) { -- cgit v1.2.3