क्या कोई C ++ (या C) लिबास है जिसमें स्लाइसिंग, वेक्टराइज्ड ऑपरेशंस के लिए सपोर्ट के साथ न्यूमप जैसे एरर हैं, जो कंटेंट-बाय-एलिमेंट आदि को जोड़ते और घटाते हैं?
क्या कोई C ++ (या C) लिबास है जिसमें स्लाइसिंग, वेक्टराइज्ड ऑपरेशंस के लिए सपोर्ट के साथ न्यूमप जैसे एरर हैं, जो कंटेंट-बाय-एलिमेंट आदि को जोड़ते और घटाते हैं?
जवाबों:
यहां कई मुफ्त सॉफ़्टवेयर हैं जो आपकी आवश्यकताओं के अनुरूप हो सकते हैं।
जीएनयू वैज्ञानिक पुस्तकालय इस प्रकार सी में लिखा एक GPL सॉफ्टवेयर है, यह एक सी की तरह आवंटन और प्रोग्रामिंग (संकेत, आदि) के रास्ते है। GSLwrap के साथ , आप GSL का उपयोग करते समय, प्रोग्रामिंग का C ++ तरीका पा सकते हैं। GSL में BLAS कार्यान्वयन है, लेकिन आप डिफ़ॉल्ट CBLAS के बजाय ATLAS का उपयोग कर सकते हैं , यदि आप और भी अधिक प्रदर्शन चाहते हैं।
बढ़ावा / uBLAS पुस्तकालय एक बीएसएल पुस्तकालय, सी ++ में लिखा और एक बढ़ावा पैकेज के रूप में वितरित है। यह एक सी ++ है - बीएलएएस मानक को लागू करने का तरीका। uBLAS कुछ रैखिक बीजगणित कार्यों के साथ आता है, और ATLAS के लिए एक प्रयोगात्मक बाध्यकारी है ।
eigen एक रैखिक बीजगणित पुस्तकालय है जो C ++ में लिखा गया है, जिसे MPL2 लाइसेंस (संस्करण 3.1.1 से शुरू) या LGPL3 / GPL2 (पुराने संस्करणों) के तहत वितरित किया गया है। यह प्रोग्रामिंग का C ++ तरीका है, लेकिन दो अन्य (अधिक एल्गोरिदम और डेटा संरचनाएं उपलब्ध हैं) की तुलना में अधिक एकीकृत है। डेगनो मानक बीएलएएस एपीआई का पालन नहीं करते हुए ऊपर दिए गए बीएलएएस कार्यान्वयनों की तुलना में ईजन का दावा अधिक तेज़ है। Eigen समानांतर कार्यान्वयन पर बहुत अधिक प्रयास नहीं करता है।
आर्मडिलो C ++ के लिए LGPL3 लाइब्रेरी है। इसमें LAPACK (numpy द्वारा उपयोग की जाने वाली लाइब्रेरी) के लिए बाइंडिंग है । यह पुनरावर्ती टेम्प्लेट और टेम्प्लेट मेटा-प्रोग्रामिंग का उपयोग करता है, जो एक अच्छा बिंदु है (मुझे नहीं पता कि क्या अन्य पुस्तकालय भी ऐसा कर रहे हैं?)।
xtensor एक C ++ लाइब्रेरी है जो BSD लाइसेंस प्राप्त है। यह A C ++ API को बहुत अधिक NumPy के समान प्रदान करता है। एक धोखा पत्र के लिए https://xtensor.readthedocs.io/en/latest/numpy.html देखें ।
ये विकल्प वास्तव में अच्छे हैं यदि आप केवल डेटा संरचना और बुनियादी रैखिक बीजगणित प्राप्त करना चाहते हैं। शैली, लाइसेंस या sysadmin चुनौतियों के बारे में अपने स्वाद के आधार पर (LAPACK जैसी बड़ी लाइब्रेरी स्थापित करना मुश्किल हो सकता है), आप अपनी आवश्यकताओं के अनुसार सबसे अच्छा सूट चुन सकते हैं।
a[:4,::-1,:,19] = b[None,-5:,None]
या a[a>5]=0
समान चीज़ों का समर्थन करती हैं , साथ ही साथ उपलब्ध सरणी और सूचकांक हेरफेर कार्यों का एक बड़ा समूह है। मैं वास्तव में आशा करता हूं कि कोई व्यक्ति किसी दिन सी ++ के लिए ऐसा कुछ करे।
a.colRange(4,7).rowRange(4,8)
लिए a[4:7,4,8]
) और स्थिति मुखौटा (के a.setTo(cv::Scalar(0), a>5)
लिए a[a>5]=0
)
Xtensor बाहर की कोशिश करो । (देखें एक्सपेन्सर चीट शीट को न्यूपी ।)
xtensor एक C ++ लाइब्रेरी है जो बहु-आयामी सरणी अभिव्यक्तियों के साथ संख्यात्मक विश्लेषण के लिए है।
xtensor प्रदान करता है
उदाहरण
2-डी सरणी को इनिशियलाइज़ करें और इसकी एक पंक्ति और 1-डी सरणी की गणना करें।
#include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"
xt::xarray<double> arr1
{{1.0, 2.0, 3.0},
{2.0, 5.0, 7.0},
{2.0, 5.0, 7.0}};
xt::xarray<double> arr2
{5.0, 6.0, 7.0};
xt::xarray<double> res = xt::view(arr1, 1) + arr2;
std::cout << res;
आउटपुट
{7, 11, 14}
एक 1-D सरणी को आरम्भ करें और इसे फिर से चालू करें।
#include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"
xt::xarray<int> arr
{1, 2, 3, 4, 5, 6, 7, 8, 9};
arr.reshape({3, 3});
std::cout << arr;
आउटपुट
{{1, 2, 3},
{4, 5, 6},
{7, 8, 9}}
DyND को C ++ के लिए एक NumPy जैसी लाइब्रेरी, अन्य चीजों के साथ बनाया गया है। प्रसारण, अंकगणित संचालक, और सभी काम ठीक करने जैसी चीजें। दूसरी ओर, यह अभी भी बहुत प्रयोगात्मक है और कई सुविधाओं को अभी तक लागू नहीं किया गया है।
यहाँ सी + + में डी Castelnau कलन विधि का एक सरल कार्यान्वयन DyND सरणियों का उपयोग कर रहा है:
#include <iostream>
#include <dynd/array.hpp>
using namespace dynd;
nd::array decasteljau(nd::array a, double t){
size_t e = a.get_dim_size();
for(size_t i=0; i < e-1; i++){
a = (1.-t) * a(irange()<(e-i-1)) + t * a(0<irange());
}
return a;
}
int main(){
nd::array a = {1., 2., 2., -1.};
std::cout << decasteljau(a, .25) << std::endl;
}
मैंने फोरट्रान 90, सी ++ में डीआईएनडीआर और पायथन में न्यूमिप के लिए वाक्यविन्यास की तुलना और उदाहरणों के साथ थोड़ी देर पहले एक ब्लॉग पोस्ट लिखा था ।
अस्वीकरण: मैं वर्तमान DyND डेवलपर्स में से एक हूं।
Eigen एक अच्छा रैखिक बीजगणित पुस्तकालय है।
http://eigen.tuxfamily.org/index.php?title=Main_Page
हेडर-ओनली लाइब्रेरी के बाद से इसे स्थापित करना काफी आसान है। यह अच्छी तरह से अनुकूलित कोड उत्पन्न करने के लिए टेम्पलेट पर निर्भर करता है। यह स्वचालित रूप से मैट्रिक्स ऑपरेशन को वेक्टर करता है।
यह उदाहरण के लिए दो मेट्रिसेस के बीच "प्रति गुणन गुणन" जैसे गुणांक वार संचालन का भी पूर्ण समर्थन करता है। यह वही है जो आपको चाहिए?
ब्लिट्ज ++ अक्षों की एक मनमानी संख्या के साथ सरणियों का समर्थन करता है, जबकि आर्मडिलो केवल तीन (वैक्टर, मैट्रिस और क्यूब्स) का समर्थन करता है। ईजन केवल वैक्टर और मैट्रीस (क्यूब्स नहीं) का समर्थन करता है। नकारात्मक पक्ष यह है कि ब्लिट्ज ++ में बुनियादी एंट्रीवाइज ऑपरेशंस और टेंसर संकुचन से परे रैखिक बीजगणित फ़ंक्शन नहीं हैं। लगता है कि विकास कुछ समय पहले काफी धीमा हो गया था, लेकिन शायद ऐसा सिर्फ इसलिए है क्योंकि पुस्तकालय वही करता है जो वह करता है और कई बदलाव करने की जरूरत नहीं है।
xtensor अच्छा है, लेकिन मैंने c ++ 20 के साथ एक खिलौना परियोजना के रूप में खुद को एक मिनी-लाइब्रेरी लिखना समाप्त कर दिया, जबकि इंटरफ़ेस को यथासंभव सरल रखने की कोशिश कर रहा था। यहाँ यह है: https://github.com/gbalduzz/NDArray
उदाहरण कोड:
using namespace nd;
NDArray<int, 2> m(3, 3); // 3x3 matrix
m = 2; // assign 2 to all
m(-1, all) = 1; // assign 1 to the last row.
auto tile = m(range{1, end}, range{1, end}); // 2x2 tile
std::sort(tile.begin(), tile.end());
std::cout << m; // prints [[2, 2, 2], [2, 1, 1], [1, 2, 2]]
यह फैंसी अंकगणितीय ऑपरेटरों को एक साथ कई ऑपरेशनों को ध्वस्त करने की सुविधा प्रदान नहीं करता है, फिर भी, लेकिन आप मनमाने ढंग से लंबोदा को समान आकार के साथ दसियों के सेट पर प्रसारित कर सकते हैं, या आलसी रूप से मूल्यांकन किए गए अंकगणितीय ऑपरेटरों का उपयोग कर सकते हैं।
मुझे बताएं कि आप इंटरफ़ेस के बारे में क्या सोचते हैं और अन्य विकल्पों के साथ इसकी तुलना कैसे करते हैं, और अगर इससे कोई उम्मीद है, तो आप किस तरह के संचालन को लागू करना चाहते हैं।
मुफ्त लाइसेंस और कोई निर्भरता नहीं!
परिशिष्ट: मैं xtensor को ठीक से संकलित करने और चलाने में कामयाब रहा, और इसका परिणाम यह है कि विचारों पर (2 से 3X) पुनरावृति होने पर मेरी लाइब्रेरी काफी तेज है
VIGRA में एक अच्छा एन-आयामी सरणी कार्यान्वयन शामिल है:
http://ukoethe.github.io/vigra/doc/vigra/Tutorial.html
मैं इसे बड़े पैमाने पर उपयोग करता हूं, और इसे बहुत सरल और प्रभावी लगता हूं। यह केवल हेडर है, इसलिए आपके विकास के वातावरण में एकीकृत करना बहुत आसान है। यह मैं एपीआई के रूप में NumPy का उपयोग करने के लिए आया हूँ निकटतम बात है।
मुख्य नकारात्मक पक्ष यह है कि यह दूसरों के रूप में व्यापक रूप से उपयोग नहीं किया जाता है, इसलिए आपको ऑनलाइन मदद नहीं मिलेगी। यह, और यह अजीब नाम है (इसके लिए खोज करने का प्रयास करें!)
LibTorch (C ++ के लिए PyTorch frontend) का उपयोग करें और खुश रहें।
यह एक पुराना सवाल है। फिर भी जवाब देने जैसा लगा। सोचा कई मदद कर सकते हैं, विशेष रूप से pydevs C ++ में कोडिंग।
यदि आप पहले से ही अजगर सुन्न के साथ काम कर चुके हैं, तो NumCpp एक शानदार विकल्प है। यह वाक्य रचना में न्यूनतर है और पाई सुन्न के समान कार्य या विधियां प्राप्त की है।
तुलना रीडमी दस्तावेज़ में हिस्सा भी बहुत बहुत शांत है।
NumCpp
nc::NdArray<int> arr = {{4, 2}, {9, 4}, {5, 6}};
arr.reshape(5, 3);
arr.astype<double>();
यदि आप छवि प्रसंस्करण या तंत्रिका नेटवर्क के लिए बहुआयामी सरणी (जैसे संख्यात्मक) का उपयोग करना चाहते हैं, तो आप OpenCV
cv::Mat
टन के साथ इमेज प्रोसेसिंग एल्गोरिदम का उपयोग कर सकते हैं । यदि आप केवल मैट्रिक्स ऑपरेशन के लिए इसका उपयोग करना चाहते हैं, तो आपको आकार कम करने और छोटे OpenCV लाइब्रेरी रखने के लिए संबंधित ऑप्सनव मॉड्यूल का संकलन करना होगा।
cv::Mat
(मैट्रिक्स) एक एन-आयामी सरणी है जिसका उपयोग विभिन्न प्रकार के डेटा को स्टोर करने के लिए किया जा सकता है, जैसे RGB, HSV या ग्रेस्केल इमेज, असली या जटिल मान वाले वैक्टर, अन्य मैट्रिसेस आदि।
एक Mat में निम्न जानकारी होती है: width, height, type, channels, data, flags, datastart, dataend
इत्यादि।
मैट्रिक्स हेरफेर के लिए इसमें कई तरीके हैं। बोनस आप CUDA कोर पर और फिर बना सकते हैं cv::cuda::GpuMat
।
विचार करें कि मैं 10 पंक्तियों, 20 स्तंभों के साथ एक मैट्रिक्स बनाना चाहता हूं, CV_32FC3 टाइप करें:
int R = 10, C = 20;
Mat m1;
m1.create(R, C, CV_32FC3); //creates empty matrix
Mat m2(cv::Size(R, C), CV_32FC3); // creates a matrix with R rows, C columns with data type T where R and C are integers,
Mat m3(R, C, CV_32FC3); // same as m2
बक्शीश:
बस मैट्रिक्स ऑपरेशन के लिए छोटे और कॉम्पैक्ट ओपन लाइब्रेरी का संकलन करें। इस लेख में बताए गए तरीकों में से एक बार।
या
निम्नलिखित cmake कमांड का उपयोग करके opencv सोर्स कोड संकलित करें:
$ git clone https://github.com/opencv/opencv.git
$ cd opencv
$ git checkout <version you want to checkout>
$ mkdir build
$ cd build
$ cmake -D WITH_CUDA=OFF -D WITH_MATLAB=OFF -D BUILD_ANDROID_EXAMPLES=OFF -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -DANDROID_STL=c++_shared -DBUILD_SHARED_LIBS=ON -D BUILD_opencv_objdetect=OFF -D BUILD_opencv_video=OFF -D BUILD_opencv_videoio=OFF -D BUILD_opencv_features2d=OFF -D BUILD_opencv_flann=OFF -D BUILD_opencv_highgui=OFF -D BUILD_opencv_ml=OFF -D BUILD_opencv_photo=OFF -D BUILD_opencv_python=OFF -D BUILD_opencv_shape=OFF -D BUILD_opencv_stitching=OFF -D BUILD_opencv_superres=OFF -D BUILD_opencv_ts=OFF -D BUILD_opencv_videostab=OFF -D BUILD_opencv_dnn=OFF -D BUILD_opencv_imgproc=OFF ..
$ make -j $nproc
$ sudo make install
इस उदाहरण का प्रयास करें:
#include "opencv2/core.hpp"
#include<iostream>
int main()
{
std::cout << "OpenCV Version " << CV_VERSION << std::endl;
int R = 2, C = 4;
cv::Mat m1;
m1.create(R, C, CV_32FC1); //creates empty matrix
std::cout << "My Mat : \n" << m1 << std::endl;
}
निम्नलिखित आदेश के साथ कोड संकलित करें:
$ g++ -std=c++11 opencv_mat.cc -o opencv_mat `pkg-config --libs opencv` `pkg-config --cflags opencv`
निष्पादन योग्य चलाएँ:
$ ./opencv_mat
OpenCV Version 3.4.2
My Mat :
[0, 0, 0, 0;
0, 0, 0, 0]
GSL महान है, यह आप पूछ और भी बहुत कुछ कर रहे हैं के सभी नहीं करता है। यह हालांकि GPL के तहत लाइसेंस प्राप्त है।
जबकि GLM को ओपनजीएल और GLSL के साथ आसानी से मेष करने के लिए डिज़ाइन किया गया है, यह पूरी तरह से कार्यात्मक हेडर है केवल सी + + के लिए गणित पुस्तकालय जिसमें इंटरफेस का बहुत सहज सेट है।
यह वेक्टर और मैट्रिक्स प्रकारों के साथ-साथ उन पर विभिन्न कार्यों की घोषणा करता है।
दो मैट्रिसेस को गुणा करना एक सरल (M1 * M2) है। दो वैक्टर (V1- V2) घटाना।
वैक्टर या मेट्रिसेस में सम्मिलित मान समान रूप से सरल है। उदाहरण के लिए एक vec3 वेक्टर घोषित करने के बाद, कोई भी वेक्टर के साथ अपने पहले तत्व तक पहुंच सकता है। इसकी जांच - पड़ताल करें।