কীভাবে নমুনা অ্যারেগুলিকে ভেক্টরে <int> & (রেফারেন্স) রূপান্তর করতে হবে SWIG এর সাথে


10

আমার লক্ষ্য:

অজগরটিতে 3 টি আঙ্কুল অ্যারে তৈরি করুন (এর মধ্যে 2 টি নির্দিষ্ট মান দিয়ে শুরু করা হবে), তারপরে তাদের তিনটিকেই ভেক্টর রেফারেন্স হিসাবে সি ++ ফাংশনে স্যুইগের মাধ্যমে প্রেরণ করুন (এটি ডেটা অনুলিপি করা এবং দক্ষতা হারাতে এড়ানোর জন্য)। সি ++ ফাংশনে একবার, অ্যারেগুলির মধ্যে 2 যোগ করুন এবং তাদের যোগফল 3 য় অ্যারেতে রাখুন।

vec_ref.h

#include <vector>
#include <iostream>

void add_vec_ref(std::vector<int>& dst, std::vector<int>& src1, std::vector<int>& src2);

vec_ref.cpp

#include "vec_ref.h"
#include <cstring> // need for size_t
#include <cassert>

void add_vec_ref(std::vector<int>& dst, std::vector<int>& src1, std::vector<int>& src2) {
    std::cout << "inside add_vec_ref" << std::endl;
    assert(src1.size() == src2.size());
    dst.resize(src1.size());

    for (size_t i = 0; i < src1.size(); i++) {
        dst[i] = src1[i] + src2[i];
    }
}

vec_ref.i

%module vec_ref
%{
    #define SWIG_FILE_WITH_INIT
    #include "vec_ref.h"
%}

%include "numpy.i"
%init %{
import_array();
%}

%include "std_vector.i"
%template(vecInt) std::vector<int>;
// %template(vecIntRef) std::vector<int> &; 

// %apply (std::vector<int> * INPLACE_ARRAY1, int DIM1) {(std::vector<int> * dst, int a),(std::vector<int> * src1, int b),(std::vector<int> * src2, int c)};
// %apply (std::vector<int> * INPLACE_ARRAY1) {(std::vector<int> * dst),(std::vector<int> * src1),(std::vector<int> * src2)};
// %apply (std::vector<int> & INPLACE_ARRAY1) {(std::vector<int> & dst),(std::vector<int> & src1),(std::vector<int> & src2)};
// %apply (std::vector<int> & INPLACE_ARRAY1, int DIM1) {(std::vector<int> & dst, int a),(std::vector<int> & src1, int b),(std::vector<int> & src2, int c)};

%include "vec_ref.h"

Makefile নামক

all:
    rm -f *.so *.o *_wrap.* *.pyc *.gch vec_ref.py
    swig -c++ -python vec_ref.i
    g++ -O0 -g3 -fpic -c vec_ref_wrap.cxx vec_ref.h vec_ref.cpp -I/home/lmckeereid/tools/anaconda3/pkgs/python-3.7.3-h0371630_0/include/python3.7m/
    g++ -O0 -g3 -shared vec_ref_wrap.o vec_ref.o -o _vec_ref.so

tester.py

import vec_ref as vec
import numpy as np

a = np.array([1,2,3], dtype=np.intc)
b = np.array([4,5,6], dtype=np.intc)
c = np.zeros(len(a), dtype=np.intc)

print('---Before---\na:', a)
print('b:', b)
print('c:', c)

vec.add_vec_ref(c,a,b)

print('---After---\na:', a)
print('b:', b)
print('c:', c)

আউটপুট:

---Before---
a: [1 2 3]
b: [4 5 6]
c: [0 0 0]
Traceback (most recent call last):
  File "tester.py", line 12, in <module>
    vec.add_vec_ref(c,a,b)
TypeError: in method 'add_vec_ref', argument 1 of type 'std::vector< int,std::allocator< int > > &'

আমি vec_ref.i এ পাওয়া সমস্ত%% প্রয়োগ এবং% টেম্পলেট নির্দেশাবলীর চেষ্টা করেছি, কিন্তু তারা কার্যকর হয়নি।

এমন কিছু টাইপম্যাপ রয়েছে যা আমাকে অন্তর্ভুক্ত করা উচিত যা আমি নই?


3
এটা সম্ভব না. সি ++ এ আপনি কেবলমাত্র বিদ্যমান বস্তুর রেফারেন্স তৈরি করতে পারেন। যাইহোক, নপি অ্যারেতে একটি থাকে না std::vector
PSchill

উত্তর:


3

আমি @pschill এর সাথে একমত: ডেটা অনুলিপি না করে std :: ভেক্টর পাওয়া সম্ভব নয়।

একটি বিকল্প হ'ল std::spanশ্রেণীর টেম্পলেট (সি ++ 20 এ প্রবর্তিত) বা spanলাইব্রেরিতে সংজ্ঞায়িত একই ধরণের শ্রেণির টেম্পলেট ব্যবহার করা।

একটি তৈরি করা হচ্ছে std::span<int>একটি প্রদান করবে দৃশ্যে একটি বিদ্যমান তথ্য numpyঅ্যারে, এবং প্রদান অনেক সুবিধাজনক সদস্য ফাংশন (যেমন operator[], iterators, front(), back(), ইত্যাদি) C ++।

স্প্যান তৈরি করা কখনই নাম্পার অ্যারে থেকে ডেটা অনুলিপি করে না


আমি যা সেরা বিকল্প হিসাবে দেখি তা সরবরাহ করার জন্য ধন্যবাদ (আমার নিজের শ্রেণি তৈরি করা বাদে)।
অন্যতা

আমি যদি সত্যিই অনুলিপি না করে আমার সি ++ ফাংশনে একটি স্টাডি :: ভেক্টর ব্যবহার করতে (এবং সংশোধন করতে) চাইতাম তবে আমার কী বিকল্প থাকতে পারে? স্টাড :: ভেক্টর থেকে কাঁচা পয়েন্টার? শেয়ারড_প্রেটার স্টাড :: ভেক্টর?
গ্যাব্রিয়েল ডেভিলার

@ গ্যাব্রিয়েল ডেভিলারস, যদি আমি আপনার প্রশ্নটি বুঝতে পারি, যদি কোনও ভেক্টর উপস্থিত থাকে এবং আপনি যদি আপনার কার্যক্রমে এটি পরিবর্তন করতে চান তবে আমি ভেক্টরটির একটি রেফারেন্স ব্যবহার করার পরামর্শ দেব : std::vector<T>& v
নিকোলাসএম

@ নিকোলাসএম আমার অর্থ এমন একটি এপিআই যা আমি SWIG ব্যবহার করে মোড়াতে চাই। আমি জিজ্ঞাসা করছি কারণ আমি বুঝতে পারি যে এসডাব্লুআইজি ভেক্টরগুলিকে নন-কনস্ট্যান্ট রেফারেন্সটি মোড়তে পারে না।
গ্যাব্রিয়েল ডেভিলার্স

ওহ দুঃখিত. আমি আপনাকে একটি নতুন প্রশ্ন তৈরি করার পরামর্শ দিচ্ছি যা আপনার নির্দিষ্ট ক্ষেত্রে ফোকাস করে।
নিকোলাসএম

0

আপনি ফেসবুক ফেইস লাইব্রেরিতে উল্লেখ করতে পারেন, যা আপনি যা অর্জন করতে চান তা অর্জন করে আরও মার্জিত উপায়ে:

পাইথন-নির্দিষ্ট: নম্পী অ্যারে <-> সি ++ পয়েন্টার ইন্টারফেস (ভেক্টর)

আপনি কোডটি তার গিথুব পৃষ্ঠায় দেখতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.